下載文件須要設置response的倆個響應頭及輸出流
* 兩個頭一個流
* 1. Content-Type:設置下載資源類型(MIME類型)
* 2. Content-Disposition:下載框及下載文件名
* 3. 流:下載文件的數據,文件流html
準備工做:須要導入 commons-io.jar包java
爲了解決下載框彈出文件名的亂碼問題,通常須要導入以下方法:瀏覽器
// 用來對下載的文件名稱進行編碼的! public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException { String agent = request.getHeader("User-Agent"); //獲取瀏覽器 if (agent.contains("Firefox")) { BASE64Encoder base64Encoder = new BASE64Encoder(); filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; } else if(agent.contains("MSIE")) { filename = URLEncoder.encode(filename, "utf-8"); } else { filename = URLEncoder.encode(filename, "utf-8"); } return filename; }
文件下載的具體步驟設置:this
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); /* * 兩個頭一個流 * 1. Content-Type:下載資源類型 * 2. Content-Disposition:下載框及下載文件名 * 3. 流:下載文件的數據,文件流 */ String filename = "D:/音樂/韓紅-天路.mp3"; // 爲了使下載框中下載文件名顯示中文文件名稱不出亂碼! String framename = filenameEncoding("流光%飛舞.mp3", request); //經過文件名稱獲取MIME類型 String contentType = this.getServletContext().getMimeType(filename); //設置下載框 String contentDisposition = "attachment;filename=" + framename; // 文件流 FileInputStream input = new FileInputStream(filename); //設置頭 response.setHeader("Content-Type", contentType); response.setHeader("Content-Disposition", contentDisposition); // 獲取綁定了響應端的流 ServletOutputStream output = response.getOutputStream(); IOUtils.copy(input, output);//把輸入流中的數據寫入到輸出流中。 input.close(); }