0

我无法显示BLOBmysql保存的图像。我有豆子,jsp。我使用3多层架构,我想用图片展示所有产品。

在访问者中:

 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)

4

2 回答 2

4

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

您应该做的是创建一个单独的 Servlet,它只Blob从数据库中检索 . 并将其内容流式传输到response.getOutputStream(). 在您的 JSP 中,您添加一个<img>标签,其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”。

于 2013-04-05T11:55:43.757 回答
0

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

BalusC 前段时间发表了一篇关于通过 servlet 从数据库 blob 恢复的图像服务的 2 篇精彩文章:

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

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

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

于 2013-04-05T12:04:48.627 回答