p:graphicImage 的替代方案,它可以显示来自 byte[] 的图像并控制浏览器缓存

Alternative for p:graphicImage which can show images from byte[] and control browser cache

使用更新功能时 p:graphicimage 似乎存在错误。通过 value="#{myController.myStreamedContent}" 加载一张图像有效,但是当更改 myController.myStreamedContent 后更新 p:graphicimage 时,先前加载的图像保持不变。可以设置 cache="false",但这在我的 Firefox 45.0 中不起作用。我使用 PrimeFaces 5.3。

以下网站也提到了这一点:

是否有任何替代方案可以提供与 p:graphicimage 相似或相同的功能?我基本上需要能够在 MEDIUMBLOB.

中显示存储为 byte[] 的图像

JSF 实用程序库OmniFaces has a <o:graphicImage> which does technically a better job in streaming and caching the images. It doesn't invoke the getter method twice,但只在浏览器真正需要下载图像时才执行一次。此外,它支持使用 byte[]InputStream 而无需包装器。总而言之,您最终会得到更清晰的模型。

@Named
@ApplicationScoped
public class ImageStreamer {

    @Inject
    private ImageService service;

    public byte[] getById(Long id) {
        return service.getContent(id);
    }

}

<o:graphicImage value="#{imageStreamer.getById(bean.image.id)}" />

默认情况下强制浏览器不缓存图像,因此每次请求都会下载图像。为了提高效率,可以设置 lastModified 属性以允许浏览器缓存图像,只要图像未根据 lastModified 值更改。

<o:graphicImage value="#{imageStreamer.getById(bean.image.id)}" lastModified="#{bean.image.lastModified}" />