Spring + JSF - 从数据库中检索图像并在Brower中显示

时间:2017-02-23 01:44:55

标签: java mysql spring image jsf-2

我正在使用Spring 4 + JSF 2.0框架+ MySQL数据库开发一个网站。 我正在尝试从数据库中检索图像并将其显示在浏览器上。 所以基本上我有一个名为product_t的表,其中有一个名为image的LongBlob列,它负责存储png文件。

我需要从页面中的每个产品中检索每个图像,所以:

<ui:repeat value="#{productControllerImpl.list3NotNewRandomProducts()} var="product" varStatus="status">
<h2>#{product.name}</h2>
<strong>#{product.subDescription}</strong><br></br> <span>#{product.description}
</ui:repeat>

到目前为止一切顺利。

我在google上搜索以下解决方案:

对于UI中的每个产品,我需要调用Servlet来检索图像。 当我使用JSF + Spring时,我在UI中编写了以下块代码:

<h:graphicImage   value="/images/#{productControllerImpl.findProductImageById(product.id)}"/>

在我的productControllerImpl中我有这个:

@Override
public byte[] findProductImageById(Long productId) {
    byte[] productImage = null;
    HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();      
    ServletOutputStream outputStream = null; 
    try {
        productImage = productService.findProductImageById(productId);
        response.reset();           
        outputStream = response.getOutputStream();
        response.setContentType("image/png");
        outputStream.write(productImage);
        outputStream.flush();       
        outputStream.close();
    } catch(Throwable e){
        throw new RuntimeException("Error processing product image: " + e.getMessage(), e);
    }

    return null;
}

所以基本上我从迭代中接收产品,并在数据库中搜索相应的产品图像(我不知道这是否是最佳选择)。

这里的问题是,当访问此页面时,我会在浏览器中收到完整的图像:

Product Image

我在这方面很失落。

有人知道我在这里缺少什么吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我假设你指的是Show image as byte[] from database as graphic image in JSF page

我认为您的主要问题是您要结束您的回复流: outputStream.flush();
outputStream.close(); 删除它们,然后在doGet上再次尝试使用图像servlet。

我个人更喜欢这里提到的PrimeFaces的StreamedContent Display dynamic image from database with p:graphicImage and StreamedContent

或OmniFaces graphicImage http://showcase.omnifaces.org/components/graphicImage而不是创建servlet来输出内容。

BalusC的这篇文章将解决您的所有问题:Servlet for serving static content