文件下载流程
服务器端编码下载原理分析
通过response可以获取输出流,我们将要下载的资源,通过response获取的输出流直接写
回到浏览器端就可以。
服务器端下载两个响应头设置
- 1,怎样能通知浏览器,下载文件是什么?
通过response.setContentType设置响应数据的mimeType类型
获取一个文件的mimeType类型
ServletContext.getMimeType(String filename) - 2, 设置下载文件名称
response.setHeader("Content-Disposition","attachement;filename=下载名称")
下载乱码问题
对于下载时,我们在显示下载文件名称时,如果包含了中文,就可能出现乱码问题,出现的原因,是对于
不同的浏览器,他们在处理下载文件时的编码不一致,ie浏览器使用的是utf-8编码,而firefox浏览器使用的是base64编码。
例
response.setCharacterEncoding("utf-8");
String filename = request.getParameter("filename");
String downPath = path+"/upload";
FileInputStream in = new FileInputStream(downPath+File.separator+filename);
if(request.getHeader("user-agent").toLowerCase().contains("msie")){
filename = URLEncoder.encode(filename, "UTF-8");
}else{
filename = new String(filename.getBytes("UTF-8"),"iso-8859-1");
}
response.setHeader("content-disposition", "attachment;filename="+filename);
response.setHeader("content-type",this.getServletContext().getMimeType(filename));
OutputStream os = response.getOutputStream();
byte[] buffer = new byte[1024];
int len=0;
while((len=in.read(buffer))!=-1) {
os.write(buffer, 0, len);
}
in.close();
os.close();
2016.11.10