文件下載流程
服務(wù)器端編碼下載原理分析
通過response可以獲取輸出流翅雏,我們將要下載的資源棍矛,通過response獲取的輸出流直接寫
回到瀏覽器端就可以蕴掏。
服務(wù)器端下載兩個(gè)響應(yīng)頭設(shè)置
- 1门坷,怎樣能通知瀏覽器默勾,下載文件是什么休建?
通過response.setContentType設(shè)置響應(yīng)數(shù)據(jù)的mimeType類型
獲取一個(gè)文件的mimeType類型
ServletContext.getMimeType(String filename) - 2, 設(shè)置下載文件名稱
response.setHeader("Content-Disposition","attachement;filename=下載名稱")
下載亂碼問題
對于下載時(shí)乍恐,我們在顯示下載文件名稱時(shí)评疗,如果包含了中文,就可能出現(xiàn)亂碼問題茵烈,出現(xiàn)的原因百匆,是對于
不同的瀏覽器,他們在處理下載文件時(shí)的編碼不一致呜投,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