我们如何使用OmniFaces在JSF 2.0中嵌入并显示InputStream
动态图像?
答案 0 :(得分:2)
OmniFaces尚未为此提供任何实用程序。
如果映像文件位于磁盘文件系统上,则需要在servletcontainer配置中创建虚拟上下文,以便可以通过普通URL访问它们。另请参阅Load images from outside of webapps / webcontext / deploy folder using <h:graphicImage> or <img> tag。
如果图像文件存储在DB中,那么您需要创建一个简单的servlet,它只将数据的InputStream
从数据库写入HTTP响应的OutputStream
。另请参阅How to retrieve and display images from a database in a JSP page?(请注意,这并不需要JSP / HTML,您可以使用<h:graphicImage>
,因为它只生成HTML <img>
元素。)
还有PrimeFaces <p:graphicImage>
,但实施起来有点不直观。另请参阅Display dynamic image from database with p:graphicImage and StreamedContent。
更新:自OmniFaces 2.0(适用于JSF 2.2)以来,有一个<o:graphicImage>
组件支持直接引用byte[]
或InputStream
属性在@ApplicationScoped
托管bean中,以下面的直观方式:
<o:graphicImage value="#{imageStreamer.getById(bean.imageId)}" />
@Named
@ApplicationScoped
public class ImageStreamer {
@Inject
private ImageService service;
public InputStream getById(Long id) { // byte[] is also supported.
return service.getContent(id);
}
}
与PrimeFaces <p:graphicImage>
相反,不需要<f:param>
,并且在渲染响应阶段评估EL方法参数,但仅在浏览器实际请求图像时调用EL方法本身。另请参阅the showcase和the blog on the subject。