日期:2014-05-20  浏览次数:20585 次

问个验证码最后的输出问题,2个都可以但是为什么要设置下流长度?这个我记得以前看的讲过,但是忘了,又不知道该查那点的资料,请指导下!!!

// 产生随机认证码
char[] rands = generateCheckCode();

// 创建内存图象并获得其图形上下文
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
// 产生图像
drawBackground(g);
drawRands(g, rands);
g.dispose(); // 结束图像绘制过程,完成图像






// 将图像输出给客户端
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(image, "JPEG", bos);
byte[] buf = bos.toByteArray();

response.setContentType("image/jpeg");
// 设置浏览器不要缓存此图片
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentLength(buf.length);

// 获取输出流
ServletOutputStream responseOutputStream = response.getOutputStream();
responseOutputStream.write(buf);

bos.close();
responseOutputStream.close();

// 将图像输出给客户端2
// response.setContentType("image/jpeg");
// // 设置浏览器不要缓存此图片
// response.setHeader("Pragma", "No-cache");
// response.setHeader("Cache-Control", "no-cache");
// response.setDateHeader("Expires", 0);
//
// // 获取输出流
// ServletOutputStream responseOutputStream = response.getOutputStream();
// ImageIO.write(image, "JPEG", responseOutputStream);
// responseOutputStream.close();





将图像输出给客户端1 和 将图像输出给客户端2两段代码区别在于,第一个先用个留读了下,然后字节流能得出来长度设置到了response里


自己刚开始时不懂ImageIO.write这句,查资料时候发现ServletOutputStream extends OutputStream
最后个参数只要是输出流就可以了,所以直接把从response里面得到的字节流设进去了,也正常输出。


这个地方想了解下,那里用流读出来,设置长度
response.setContentLength(buf.length);
有什么具体的意义吗?


------解决方案--------------------
表示实体内容长度,客户端可以根据这个值来判断数据是否接收完成。
------解决方案--------------------
让客户端浏览器在最开始的时候就知道你的图片的大小,可以提前预估下载所需要的时间。
比如你下载一个文件的时候,浏览器提示你已经下载了多少,还剩多少,就是根据这个算出来的。如果你没有设置,下载的时候文件大小提示的就是未知。
是否设置对最终结果都没有什么影响。