在JSF中将InputStream显示为动态图像

时间:2012-07-25 12:17:57

标签: jsf-2 inputstream omnifaces graphicimage

我们如何使用OmniFaces在JSF 2.0中嵌入并显示InputStream动态图像?

1 个答案:

答案 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 showcasethe blog on the subject