【问题标题】:Alternative for p:graphicImage which can show images from byte[] and control browser cachep:graphicImage 的替代品,它可以显示来自 byte[] 的图像并控制浏览器缓存
【发布时间】:2026-01-01 02:45:02
【问题描述】:

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

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

是否有任何替代方案可以提供与p:graphicimage 相似或相同的功能?我基本上需要能够在MEDIUMBLOB 中显示存储为byte[] 的图像。

【问题讨论】:

    标签: jsf primefaces bytearray browser-cache graphicimage


    【解决方案1】:

    JSF 实用程序库OmniFaces 有一个<o:graphicImage>,从技术上讲,它在流式传输和缓存图像方面做得更好。它不会调用getter 方法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}" />
    

    【讨论】: