Spring + JSF - 从数据库中检索图像并在浏览器中显示
Spring + JSF - Retrieve Image from Database and Show in Brower
我正在使用 Spring 4 + JSF 2.0 框架 + MySQL 数据库开发一个网站。
我正在尝试从数据库中检索图像并将其显示在浏览器上。
所以基本上我有一个名为 product_t 的 table 和一个名为 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;
}
所以基本上我是从迭代中接收产品,并在数据库中搜索相应的产品图片(我不知道这是否是最佳选择)。
这里的问题是,当访问此页面时,我在浏览器中收到完整图像:
我对这部分很迷茫。
有人知道我在这里遗漏了什么吗?
提前致谢。
我想你指的是
我认为您的主要问题是您正在结束您的回复流:
outputStream.flush();
outputStream.close();
删除它们,然后在图像 servlet 的 doGet 上重试。
就我个人而言,我更喜欢这里提到的带有 PrimeFaces 的 StreamedContent Display dynamic image from database with p:graphicImage and StreamedContent
或 OmniFaces graphicImage http://showcase.omnifaces.org/components/graphicImage 而不是创建 servlet 来输出内容。
BalusC 的 post 将解决您所有的问题:Servlet for serving static content
我正在使用 Spring 4 + JSF 2.0 框架 + MySQL 数据库开发一个网站。 我正在尝试从数据库中检索图像并将其显示在浏览器上。 所以基本上我有一个名为 product_t 的 table 和一个名为 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;
}
所以基本上我是从迭代中接收产品,并在数据库中搜索相应的产品图片(我不知道这是否是最佳选择)。
这里的问题是,当访问此页面时,我在浏览器中收到完整图像:
我对这部分很迷茫。
有人知道我在这里遗漏了什么吗?
提前致谢。
我想你指的是
我认为您的主要问题是您正在结束您的回复流:
outputStream.flush();
outputStream.close();
删除它们,然后在图像 servlet 的 doGet 上重试。
就我个人而言,我更喜欢这里提到的带有 PrimeFaces 的 StreamedContent Display dynamic image from database with p:graphicImage and StreamedContent
或 OmniFaces graphicImage http://showcase.omnifaces.org/components/graphicImage 而不是创建 servlet 来输出内容。
BalusC 的 post 将解决您所有的问题:Servlet for serving static content