文件上传和下载

No Pain No Gain

文件上传

三要素:

  • 表单提交方式为post
  • 表单中需要文件上传项
  • enctype=multipart/form-data

核心解析类:ServletFileUpload

parseRequest(HttpServletRequest req)// 解析请求,并获取相关文件项
setHeaderEncoding(String encoding)// 解决中文文件名乱码问题

文件项:FileItem

boolean isFormField(); // 返回为true,普通字段。返回为false,就是文件
String getField(); // 获取表单字段
String getString(String encoding); // 根据指定编码格式获取字段值
String getName();  // 获取上传文件名称
InputStream getInputStream();  // 获取上传文件对应的输入流

代码实现:

DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory); 

try {
	List<FileItem> fileItems = servletFileUpload.parseRequest(request); 
	
	for (FileItem fileItem : fileItems) { 
		if (fileItem.isFormField()){ 
			String desc = fileItem.getString(); 
		}else { 
			InputStream inputStream = fileItem.getInputStream(); 
			BufferedInputStream bis = new BufferedInputStream(inputStream);
			 
			String contextPath = request.getServletContext().getRealPath("upload"); 
			File contextFile = new File(contextPath); 
			
			if (!contextFile.exists()){ 
				contextFile.mkdir(); 
				}
				
			String path = contextPath+File.separator+fileItem.getName(); 
			BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(path)); 
			byte[] bys = new byte[8192]; 
			int len =1; 
			while((len = bis.read(bys)) !=1){ 
				bos.write(bys,0,len); 
			}
			bis.close(); 
			bos.close(); 
			} 
		} 
	} catch (Exception e) {}
文件下载

TCP协议+IO
手动编写代码实现下载:

  • 设置媒体类型
  • 设置下载窗口
  • 开始读写
String fileName = "aaa.txt"; 
String realPath = request.getServletContext().getRealPath("/download" + File.separator + fileName); 
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(realPath));
 
//设置媒体类型 
response.setContentType(request.getServletContext().getMimeType(fileName)); 
//设置下载窗口 
response.setHeader("Content‐Disposition","attachement;filename=" + fileName);
 
byte[] bys = new byte[8192]; 
int len =1;

BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream()); 
//开始读写 
while((len = bis.read(bys)) !=1){ 
	bos.write(bys,0,len); 
}
// 关闭流
bis.close(); 
bos.close();
解决下载文件名中乱码问题

设置窗口中的文件名称

String newFileName = null; 
String userAgent = request.getHeader("User‐Agent"); 

if("Chrome".equals(userAgent)){ 
	//谷歌 
	newFileName = URLEncoder.encode(fileName, "utf‐8"); 
}else { 
	newFileName = base64EncodeFileName(fileName); 
}

//设置下载窗口 
response.setHeader("Content‐Disposition","attachement;filename="+newFileName); 

//base64编码 
public String base64EncodeFileName(String fileName) { 
	BASE64Encoder base64Encoder = new BASE64Encoder(); 
	try {
		return "=?UTF‐8?B?" + new String(base64Encoder.encode(fileName .getBytes("UTF‐8"))) + "?="; 
	} catch (Exception e) { 
		e.printStackTrace(); throw new RuntimeException(e); 
	} 
}

明天的阳光总会驱散阴霾!中国加油,武汉加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值