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 }