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

时间:2016-03-20 03:18:59

标签: jsf primefaces bytearray browser-cache graphicimage

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

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

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

1 个答案:

答案 0 :(得分:2)

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}" />