文件下載(下載文件名亂碼解決方法)



1. 下載就是向客戶端響應字節數據!
原來我們響應的都是html的字符數據!
把一個文件變成字節數組,使用response.getOutputStream()來各應給瀏覽器!!!

2. 下載的要求
* 兩個頭一個流!
> Content-Type:你傳遞給客戶端的文件是什么MIME類型,例如:image/pjpeg
* 通過文件名稱調用ServletContext的getMimeType()方法,得到MIME類型!
> Content-Disposition:它的默認值為inline,表示在瀏覽器窗口中打開!attachment;filename=xxx
* 在filename=后面跟隨的是顯示在下載框中的文件名稱!
> 流:要下載的文件數據!
* 自己new一個輸入流即可!
3、下載的細節
顯示在下載框中的中文名稱時,會出現亂碼。
* FireFox:Base64編碼。
*Safari:ISO8859-1編碼
* 其他大部分瀏覽器:URL編碼。
通用方案:
 1    public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException {
 2         String agent = request.getHeader("User-Agent"); //獲取瀏覽器
 3         if (agent.contains("Firefox")) {
 4             BASE64Encoder base64Encoder = new BASE64Encoder();
 5             filename = "=?utf-8?B?"
 6                     + base64Encoder.encode(filename.getBytes("utf-8"))
 7                     + "?=";
 8         } else if(agent.contains("MSIE")) {
 9             filename = URLEncoder.encode(filename, "utf-8");
10         } else if(agent.contains ("Safari")) {
11             filename = new String (filename.getBytes ("utf-8"),"ISO8859-1");
12         } else {
13             filename = URLEncoder.encode(filename, "utf-8");
14         }
15         return filename;
16     }

 4、演示:

 1 package web.servlet;
 2 
 3 import org.apache.commons.io.IOUtils;
 4 import sun.misc.BASE64Encoder;
 5 
 6 import javax.servlet.ServletException;
 7 import javax.servlet.ServletOutputStream;
 8 import javax.servlet.annotation.WebServlet;
 9 import javax.servlet.http.HttpServlet;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12 import java.io.FileInputStream;
13 import java.io.IOException;
14 import java.net.URLEncoder;
15 
16 @WebServlet(name = "Download1Servlet",urlPatterns = "/Download1Servlet")
17 public class Download1Servlet extends HttpServlet {
18     public void doGet(HttpServletRequest request, HttpServletResponse response)
19             throws ServletException, IOException {
20         /*
21          *  兩個頭一個流
22          *  1、Content-Type
23          *  2、Content-Disposition
24          *  3、流:下載文件的數據
25          * */
26         String filename = "/Users/Shared/薛之謙-一半.mp3";
27         String framename = filenameEncoding("薛之謙-一半.mp3",request);
28         String contentType = this.getServletContext()
29                 .getMimeType(filename);//通過文件名獲取MIME類型
30         String contentDisposition = "attachment;filename="+framename;
31         //一個流
32         FileInputStream input = new FileInputStream("/Users/Shared/薛之謙-一半.mp3");
33         //設置頭
34         response.setHeader("content-Type",contentType);
35         response.setHeader("content-Disposition",contentDisposition);
36         //獲取綁定了響應端的流
37         ServletOutputStream output = response.getOutputStream();
38         IOUtils.copy(input,output);//把輸出流中的數據寫入到輸出流中
39         input.close();
40     }
41   public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException {
42         String agent = request.getHeader("User-Agent"); //獲取瀏覽器
43         if (agent.contains("Firefox")) {
44             BASE64Encoder base64Encoder = new BASE64Encoder();
45             filename = "=?utf-8?B?"
46                     + base64Encoder.encode(filename.getBytes("utf-8"))
47                     + "?=";
48         } else if(agent.contains("MSIE")) {
49             filename = URLEncoder.encode(filename, "utf-8");
50         } else if(agent.contains ("Safari")) {
51             filename = new String (filename.getBytes ("utf-8"),"ISO8859-1");
52         } else {
53             filename = URLEncoder.encode(filename, "utf-8");
54         }
55         return filename;
56     }
57 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM