在数据库中以BLOB形式存储的img标签中显示图像

时间:2013-04-05 11:48:35

标签: java blob java-web-start

我无法显示BLOB已保存的mysql图像。我有豆子,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)

2 个答案:

答案 0 :(得分:4)

您所看到的是Blob.toString()的结果。由于它是二进制内容,因此JVM无法真正表现出良好的表现形式。

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

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

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

请注意,您需要使用某个请求参数指定此pk变量。上面的代码行只是展示这个想法的一个例子。将请求URL复制到SQL查询中非常不安全。谷歌为“SQL注入”阅读更多相关内容。

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

答案 1 :(得分:0)

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

BalusC在不久前发布了一篇关于通过servlet从数据库博客中提取图像的2篇精彩文章:

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

最近一次使用GZIP和简历处理

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