jsf – 在内部显示数据库blob图像

我在JBoss 7.1.1上使用PrimeFaces 3.2。

我试图在< ui:repeat>中显示存储在MySQL数据库中的BLOB中的图像。图像存储在byte []中,然后转换为StreamedContent,如下所示:

InputStream stream = new ByteArrayInputStream(ingredient.getImage());
ingredient.setJsfImage(new DefaultStreamedContent(stream, "image/jpg"));

然后我试图显示在一个Facelet如下:

<ui:repeat var="ingredient" value="#{formBean.ingredientResultSet}">
    <p:panel id="resultsPanel" header="#{ingredient.location.shopName}">
        <p:graphicImage value="#{ingredient.jsfImage}" alt="No picture set" />
...

但是,当加载页面时,我在JBoss中得到以下错误:

SEVERE [org.primefaces.application.PrimeResourceHandler] (http–127.0.0.1-8080-12) Error in streaming dynamic resource.

这是怎么引起的,我该如何解决呢?

你需要意识到< p:graphicImage>实际上呈现< img src>元素,只有一个URL,然后稍后当Webbrowser将要解析获取的HTML标记并呈现结果时,单独调用。

所以,无论你在< p:graphicImage>的getter方法中做什么,它必须被设计成能够在每个请求的基础上被调用。因此,最合理的方法是创建< p:graphicImage>与< f:param>其中< p:graphicImage值>指向一个完全独立的请求或应用程序范围的bean和< f:param value>指向唯一的图像标识符。

例如。

<p:graphicImage value="#{images.image}">
    <f:param name="id" value="#{someBean.imageId}" />
</p:graphicImage>

其中Images backing bean可以看起来像这样:

@ManagedBean
@ApplicationScoped
public class Images {

    @EJB
    private ImageService service;

    public StreamedContent getImage() throws IOException {
        FacesContext context = FacesContext.getCurrentInstance();

        if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
            // So, we're rendering the view. Return a stub StreamedContent so that it will generate right URL.
            return new DefaultStreamedContent();
        }
        else {
            // So, browser is requesting the image. Return a real StreamedContent with the image bytes.
            String id = context.getExternalContext().getRequestParameterMap().get("id");
            Image image = service.find(Long.valueOf(id));
            return new DefaultStreamedContent(new ByteArrayInputStream(image.getBytes()));
        }
    }

}

或者,如果你已经使用OmniFaces 2.0 or newer,那么可以考虑使用它的<o:graphicImage>,它可以更直观地使用,几乎完全按照你的预期。参见the blog关于这个问题。

也可以看看:

> Display dynamic image from database with p:graphicImage and StreamedContent

翻译自:https://stackoverflow.com/questions/10073905/display-database-blob-images-in-pgraphicimage-inside-uirepeat

转载注明原文:jsf – 在内部显示数据库blob图像