Image 如何使用托管bean从JSF页面内的DB加载图像?

Image 如何使用托管bean从JSF页面内的DB加载图像?,image,jsf,load,Image,Jsf,Load,我有一个数据库和一些图像。谁能解释一下如何在JSF页面中加载图像 我已经有了一个托管bean,可以将图像对象转换为streamcontent。这个streamcontent是从标签中的页面调用的,但是当我检查页面的源代码时,没有可以加载图像的src。JSF呈现为HTML属性应该指向URL,而不是二进制内容。因此,您应该将URL(或至少一些标识符作为请求参数或pathinfo)存储在JSFbean中,并创建一个单独的servlet,将图像从DB流式传输到HTTP响应 在JSF页面中使用此选项: &

我有一个数据库和一些图像。谁能解释一下如何在JSF页面中加载图像

我已经有了一个托管bean,可以将图像对象转换为streamcontent。这个streamcontent是从标签
中的页面调用的,但是当我检查页面的源代码时,没有可以加载图像的
src

JSF
呈现为HTML
属性应该指向URL,而不是二进制内容。因此,您应该将URL(或至少一些标识符作为请求参数或pathinfo)存储在JSFbean中,并创建一个单独的servlet,将图像从DB流式传输到HTTP响应

在JSF页面中使用此选项:

<h:graphicImage value="images/#{bean.imageId}">
/images/*
url模式上创建一个
Servlet
类,该类映射到
web.xml
,并实现其
doGet()
方法,如下所示:

Long imageId = Long.valueOf(request.getPathInfo().substring(1)); // 123 (PS: don't forget to handle any exceptions).
Image image = imageDAO.find(imageId); // Get Image from DB.
// Image class is just a Javabean with the following properties:
// private String filename;
// private Long length;
// private InputStream content;

response.setHeader("Content-Type", getServletContext().getMimeType(image.getFilename()));
response.setHeader("Content-Length", image.getLength());
response.setHeader("Content-Disposition", "inline; filename=\"" + image.getFilename() + "\"");

BufferedInputStream input = null;
BufferedOutputStream output = null;

try {
    input = new BufferedInputStream(image.getContent());
    output = new BufferedOutputStream(response.getOutputStream());
    byte[] buffer = new byte[8192];
    int length;
    while ((length = input.read(buffer)) > 0) {
        output.write(buffer, 0, length);
    }
} finally {
    if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
    if (input != null) try { input.close(); } catch (IOException logOrIgnore) {}
}
ImageDAO#find()
中,您可以将图像用作数据库中的
InputStream


可以在中找到一个扩展示例。

您在上述代码中提到的图像实体也应该包含“高度”和“宽度”属性否?@thejartender:您可以自由选择:)但是在这种情况下,它只是无用的。在打印必要的
元素时,您更愿意在视图端(JSP/Facelets/etc)使用它。对于任何遇到此问题的人:我强调不使用普通id获取图像的重要性,除非您希望从数据库中迭代(和下载)所有图像非常容易。相反,使用BalusC posted文章中建议的id和文件名的哈希组合。
Long imageId = Long.valueOf(request.getPathInfo().substring(1)); // 123 (PS: don't forget to handle any exceptions).
Image image = imageDAO.find(imageId); // Get Image from DB.
// Image class is just a Javabean with the following properties:
// private String filename;
// private Long length;
// private InputStream content;

response.setHeader("Content-Type", getServletContext().getMimeType(image.getFilename()));
response.setHeader("Content-Length", image.getLength());
response.setHeader("Content-Disposition", "inline; filename=\"" + image.getFilename() + "\"");

BufferedInputStream input = null;
BufferedOutputStream output = null;

try {
    input = new BufferedInputStream(image.getContent());
    output = new BufferedOutputStream(response.getOutputStream());
    byte[] buffer = new byte[8192];
    int length;
    while ((length = input.read(buffer)) > 0) {
        output.write(buffer, 0, length);
    }
} finally {
    if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
    if (input != null) try { input.close(); } catch (IOException logOrIgnore) {}
}