文件下載理解: 將服務(wù)器端資源以流的形式寫入到瀏覽器中
1.通過超鏈接下載
注意: 如果瀏覽器可以解析,則會直接在瀏覽器中打開。例如,在chrome可以直接解析 圖片 和 pdf 文件,就不會彈出下載窗口
public class DownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String path = getServletContext().getRealPath("/WEB-INF/classes/秋瓷炫.jpg");
int index = path.lastIndexOf("\\");
String name = path.substring(index+1);
InputStream is = new FileInputStream(path);
ServletOutputStream outputStream = resp.getOutputStream();
int len = 0;
byte[] bys = new byte[1024];
while((len=is.read(bys))!=-1){
outputStream.write(bys,0,len);
}
is.close();
outputStream.close();
}
}
2. 強(qiáng)制彈出下載窗口
在獲取輸出流之前加上:
response.setHeader("Content-Disposition", "attachment;filename="+filename);
文件名為中文時(shí)亂碼處理
filename 如果是中文,會導(dǎo)致瀏覽器解析時(shí)亂碼, 如下

image.png
解決辦法:
方法一:
拿到瀏覽器請求的usreAgent,判斷是否包含MSIE, 如果有,URLEncode(filename,"GBK")
沒有的話,URLEncoder.encode(filename)
String agent = req.getHeader("User-Agent");
System.out.println(agent);
if(agent.indexOf("MSIE")!=-1){
name =URLEncoder.encode(name,"GBK");
}else{
name=URLEncoder.encode(name,"UTF-8");
}
resp.setHeader("Content-Disposition", "attachment;filename="+name);

image.png
方法二:
拿到瀏覽器請求的usreAgent,判斷是否包含MSIE,則將文件名以 gbk 編碼(getBytes("GBK")) , 不包含MSIE則以 “UTF-8”編碼(getBytes("UTF-8"))
然后將bytes使用ISO-8859-1解碼轉(zhuǎn)換為字符串,返回到瀏覽器。各瀏覽器基本都支持ISO編碼
轉(zhuǎn)換過程
中文 -> UTF-8 編碼 ->二進(jìn)制-> ISO-8859-1編碼->發(fā)送到客戶端 -> 客戶端 將字符串 以ISO8859-1 編碼->二進(jìn)制-> 再以UTF-8 解碼
String userAgent = request.getHeader("User-Agent");
// name.getBytes("UTF-8")處理safari的亂碼問題
byte[] bytes = userAgent.contains("MSIE") ? name.getBytes("GBK") : name.getBytes("UTF-8");
// 各瀏覽器基本都支持ISO編碼
name = new String(bytes, "ISO-8859-1");
// 文件名外的雙引號處理firefox的空格截?cái)鄦栴}
response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", name));

image.png