HTTP 文件的上载和下载

本文详细介绍了HTTP协议中文件的下载与上传操作。在下载部分,讲解了Spring MVC如何处理资源下载,包括设置响应头和Content-Type。还展示了如何实现自动下载图片以及下载Excel文件。在上传部分,根据RFC 1867标准,利用Spring MVC和Apache Commons Fileupload进行文件上传,包括表单设计和控制器方法的编写。
摘要由CSDN通过智能技术生成

HTTP 下载

http协议下载关键点:

  1. 设置响应状态码为 200
  2. 设置响应头 Content-Type
  3. 设置响应头 Content-length
  4. 在响应Body中发送下载byte数据,数据内容必须与Content-Type一致,数据长度必须与Content-Length一致。

原理:

在这里插入图片描述

Spring MVC 下载

SpringMVC对资源下载做了封装:

  1. 利用@RequestMapping(produces=“image/png”)设置Content-Type
  2. 利用@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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值