现在的位置: 首页 > 综合 > 正文

将byte[]数组转换为图像输出到页面

2013年05月01日 ⁄ 综合 ⁄ 共 1252字 ⁄ 字号 评论关闭
  1. //  
  2. byte[] imageData = (byte[]) ImageUtil.getImage(...);  
  3.                  
  4. response.setContentType("image/png");  
  5. OutputStream output = response.getOutputStream();  
  6. InputStream in = new ByteArrayInputStream(imageData);  
  7. int len;  
  8. byte[] buf = new byte[1024];  
  9. while ((len = in.read(buf)) != -1) {  
  10.    output.write(buf, 0, len);  
  11. }  
  12. output.flush();  
  13. //如果没有下面两行,可能出现getOutputStream() has already been called for this response的异常  
  14. out.clear();  
  15. out = pageContext.pushBody();  

以上是在jsp页面中显示一个图片。注意在读取图片的时候,图片的路径问题。因为tomcat读取文件是要参照服务器上的路径的,所以你需要getRealPath,像下面:
File file = new File(request.getServletContext().getRealPath("/")+"jsp\\2.jpg");

下面简单说一下我在这次图片显示的思考中所得到的:
我的需求是从数据库中读取出图片的字节流,然后保存成byte[],然后将这些byte[]数组转换成图片显示在jsp页面山。我想把根据byte[]转换成图片并且显示的这项功能写成一个servlet,然后通过img标签来显示图片。

得到上面的程序之后,我想这就好办了,由于我不仅要显示头像,还要显示菜肴的图片,店铺的图片等,因而我在逻辑jsp中读取出来持久化对象中的byte[]成员,然后将这个数组直接通过参数的形式传递给servlet,servlet再根据byte[]返回图像,这样最后就可以成功显示了,而且程序还具有很高的灵活性。

但是我失败了。。。浏览器在解析的时候总是崩溃。。。。。根本无法显示页面

原因后来我想明白了,因为我把图片的最大容量限制为2M,这样我的参数的十六进制字符串的最大容量就是2M,这些信息在浏览器进行遍历和解析的时候,会被存储在dom节点的,但是一个dom节点的最大容量是多少呢?我想浏览器是有规定的,参数大小也应该是有限制的,因而发生了内存溢出,造成浏览器崩溃。。。后来我把参数去掉之后,成功的显示了图片。

但是这样以来,我怎么知道该显示哪张图片呢?

现在的想法是,传递的参数应该换一换。换成什么呢?根据type的内容分类,然后再根据不同的类型进行细节化,因为很多持久化对象已经存储在了固定的字段值session对象中,那么我们可以取得这个对象,然后取出byte数组,最后再显示。这只能这么做了现在。

抱歉!评论已关闭.