我无法显示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)
答案 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