HTTP 下载
http协议下载关键点:
- 设置响应状态码为 200
- 设置响应头 Content-Type
- 设置响应头 Content-length
- 在响应Body中发送下载byte数据,数据内容必须与Content-Type一致,数据长度必须与Content-Length一致。
原理:
Spring MVC 下载
SpringMVC对资源下载做了封装:
- 利用@RequestMapping(produces=“image/png”)设置Content-Type
- 利用@ResponseBody 和 控制器方法 byte[]类型的返回值填充响应Body, 并且自动设置Content-Length
生成验证码图片案例:
/**
* 生成验证码图片控制器
* 其中 value="code.do"用于映射URL
* produces="image/png" 用于设置响应头中的
* Content-Type 属性
* 返回值 byte[] 会被注解@ResponseBody自动
* 处理放置到响应消息的Body中发送到客户端
*
* @ResponseBody 还会根据 byte[] 数组长度自动
* 设置 响应头部的Content-Length属性
*
* @return
*/
@RequestMapping(value="code.do",
produces="image/png")
@ResponseBody
public byte[] code(HttpSession session)
throws IOException{
String code = genCode(4);
session.setAttribute("code", code);
byte[] png = createPng(code);
return png;
}
private byte[] createPng(String code) throws IOException{
//1. 利用BufferedImage 创建 img 对象
BufferedImage img=new BufferedImage
(100, 40, BufferedImage.TYPE_3BYTE_BGR);
img.setRGB(50, 20, 0xffffff);
Graphics2D g=img.createGraphics();
Random random = new Random();
//生成随机颜色:
Color c=new Color(random.nextInt(0xffffff));
//填充图像的背景
g.setColor(c);
g.fillRect(0, 0, 100, 40);
//绘制500个随机点
for(int i=0; i<500; i++){
int x=random.nextInt(100);
int y=random.nextInt(40);
int rgb=random.nextInt(0xffffff);
img.setRGB(x, y, rgb);
}
//设置平滑抗锯齿绘制
g.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
//设置字体大小
g.setFont(new Font(Font.SANS_SERIF,
Font.PLAIN, 30));
g.setColor(new Color(
random.nextInt(0xffffff)));
g.drawString(code, 10, 30);
//随机绘制10条线段
for(int i=0; i<10; i++){
int x1=random.nextInt(100);
int y1=random.nextInt(40);
int x2=random.nextInt(100);
int y2=random.nextInt(40);
g.drawLine(x1, y1, x2, y2);
}
//2. 利用ImageIO将 img 编码为png
ByteArrayOutputStream out=
new ByteArrayOutputStream();
ImageIO