【问题标题】:Display image in img tag stored as BLOB in database在数据库中存储为 BLOB 的 img 标签中显示图像
【发布时间】:2013-03-27 19:47:26
【问题描述】:

我无法显示我在mysql 中保存的BLOB 图像。我有豆子,jsp。我用的是三层架构,我想用图片展示所有的产品。

在访问者中:

 try {
        Connection cn = getVla().getConnection();
        String sql = "SELECT * FROM products";
        PreparedStatement pst = cn.prepareStatement(sql);
        ResultSet rs = pst.executeQuery();
        ArrayList<products> ls = new ArrayList<products>();
        while(rs.next()) {
            products s = new products();
            s.setPk(rs.getLong("pk"));
            s.setName(rs.getString("name"));
            s.setPrice(rs.getDouble("price"));
            s.setPic(rs.getBlob("pic"));
            s.setComments(rs.getString("comments"));
            ls.add(s);
        }
        return ls;
    }

在产品中:

 public Blob getPic() {
        return pic;
    }

在 main.jsp 中

<%=
List<products> product = bean.getproducts();

%>
<h1>Product: </h1>
<%  
for(products c : product) { 
%>
From <%= c.getName()%> <br/>
<%= c.getPic()%></b><br/>
<b><%= c.getPrice()%> </b><br/>
<%= c.getComments()%>
<hr/>
<%
}
%>

如何显示图片? (目前我正在显示 com.mysql.jdbc.Blob@2e5f6a64)

【问题讨论】:

  • 澄清一下,您想为每个产品显示 一张图片吗?

标签: java blob java-web-start


【解决方案1】:

正如 mthmulders 所说,您所看到的是 Blob.toString() 的值。

BalusC 不久前发布了 2 篇关于通过 servlet 提供从数据库 blob 恢复的图像的精彩文章:

http://balusc.blogspot.fr/2007/04/imageservlet.html

还有一个更新的 GZIP 和恢复处理

http://balusc.blogspot.fr/2009/02/fileservlet-supporting-resume-and.html

【讨论】:

  • 请注意,这些示例从文件系统上的指定位置读取图像,而问题是关于存储在关系数据库中的图像。
  • 实际上没有第一个链接显示两者,首先来自文件系统,然后来自关系数据库
  • Marios 关于您的评论“我没有使用 servlet。我正在使用类”我同意 mthmulders 的观​​点,您可以将代码直接放在 JSP 中,但这不是一个好习惯。通过创建一个单独的 servlet 来处理图像,您可以保持视图整洁
【解决方案2】:

您看到的是Blob.toString() 的结果。由于它是二进制内容,JVM 无法真正找到一个好的表示。

你应该做的是创建一个单独的 Servlet,它只从数据库中检索 Blob 并将其内容流式传输到 response.getOutputStream()。在您的 JSP 中,添加一个 &lt;img&gt; 标记,其 src-attribute 指向您刚刚编写的 Servlet

Servlet 应该一次读取一个产品的图像,因此查询会略有不同:应该足够了

String sql = "SELECT pic FROM products where pk = " + pk;

请注意,您需要使用一些请求参数指定此 pk 变量。上面的代码行只是一个演示这个想法的例子。将请求 URL 逐字复制到 SQL 查询中是非常不安全。 Google for "SQL Injection" 了解更多相关信息。

使用Blob.getInputStream(),您可以获得一个InputStream,您可以将其内容复制到response.getOutputStream(),以便将其写回浏览器。不要忘记在该响应上设置适当的content-type,例如如果是 JPEG 图片,则为“image/jpg”。

【讨论】:

  • 您能否更具体地说明新的 servlet 必须包含哪些内容?
  • @marios:看看这里:stackoverflow.com/questions/4848819/… 和这里:stackoverflow.com/questions/6315671/… 因为我认为将文件存储在目录中并将目录路径保留在 DB 中的更好方法。跨度>
  • 好吧,您也可以将代码放入 JSP 中(就像您已经通过从 JSP 调用 bean 从数据库中获取产品一样),但我会建议反对这种方法,因为它违反了模型-视图-控制器分离,恕我直言。
  • 不是 mvc 模型是多层模型。
  • 那行不通,因为您不能直接在 JSP 中包含图像。你将总是需要一个&lt;img&gt;标签来实现这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 2014-08-05
  • 2016-11-22
  • 2015-07-31
  • 2014-01-05
相关资源
最近更新 更多