使用更新功能时,p:graphicimage
似乎存在错误。通过 value="#{myController.myStreamedContent}"
加载一张图像是可行的,但是当更改 myController.myStreamedContent
然后更新 p:graphicimage
时,先前加载的图像保持不变。可以设置 cache="false"
,但这在我的 Firefox 45.0 中不起作用。我使用 PrimeFaces 5.3。
以下网站也提到了这一点:
- PRIMEFACES - How to refresh a from clicking a ?
- Primefaces : GraphicImage does not refresh
- Why can't I update a p:graphicImage twice after upload a file with p:uploadFile
是否有任何替代方案可以提供与 p:graphicimage
类似或相同的功能?我基本上需要能够显示在 MEDIUMBLOB
中存储为 byte[]
的图像。
最佳答案
JSF 实用程序库 OmniFaces有一个 <o:graphicImage>
从技术上讲,它在流式传输和缓存图像方面做得更好。它不会调用 getter 方法 twice ,但仅当浏览器确实需要下载图像时才进行一次。此外,它还支持使用 byte[]
或InputStream
无需 wrapper 。总而言之,您最终会得到更清晰的模型。
@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}" />
关于jsf - p :graphicImage which can show images from byte[] and control browser cache 的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36109873/