下載
1. 下載就是向客戶端響應字節數據!
原來我們響應的都是html的字符數據!
把一個文件變成字節數組,使用response.getOutputStream()來各應給瀏覽器!!!
2. 下載的要求
* 兩個頭一個流!
> Content-Type:你傳遞給客戶端的文件是什么MIME類型,例如:image/pjpeg
* 通過文件名稱調用ServletContext的getMimeType()方法,得到MIME類型!
> Content-Disposition:它的默認值為inline,表示在瀏覽器窗口中打開!attachment;filename=xxx
* 在filename=后面跟隨的是顯示在下載框中的文件名稱!
> 流:要下載的文件數據!
* 自己new一個輸入流即可!
---------------------------
下載的細節
1. 顯示在下載框中的中文名稱時,會出現亂碼。
* FireFox:Base64編碼。
* 其他大部分瀏覽器:URL編碼。
通用方案:filename = new String(filename.getBytes("GBK"), "ISO-8859-1");
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;
}
---------------------------
---------------------------
源代碼:::
public class Download1Servlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
/*
* 兩個頭一個流
* 1. Content-Type
* 2. Content-Disposition
* 3. 流:下載文件的數據
*/
String filename = "E:/Singre.mp3";
// 為了使下載框中顯示中文文件名稱不出亂碼!
// String framename = new String("流光%飛舞.mp3".getBytes("GBK"), "ISO-8859-1");
String framename = filenameEncoding("Singre.mp3", req);
String contentType = this.getServletContext()
.getMimeType(filename);//通過文件名稱獲取MIME類型
String contentDisposition = "attachment;filename=" + framename;
// 一個流
FileInputStream input = new FileInputStream(filename);
//設置頭
resp.setHeader("Content-Type", contentType);
resp.setHeader("Content-Disposition", contentDisposition);
// 獲取綁定了響應端的流
ServletOutputStream output = resp.getOutputStream();
//commons-io-1.4.jar中的IOUtils
IOUtils.copy(input, output);//把輸入流中的數據寫入到輸出流中。---輸出流的節點就是客戶端
input.close();
}
// 用來對下載的文件名稱進行編碼的!
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;
}
}