1. 程式人生 > >HttpServletResponse物件實現檔案下載

HttpServletResponse物件實現檔案下載

檔案下載在我們的專案中是很常見的需求,實現檔案下載功能的方式有很多,spring-mvc框架也提供了檔案下載的功能。我們本次探討的功能是利用HttpServletResponse物件來實現檔案下載的功能。

思路如下:
(1)獲取檔案位置路徑
(2)獲取檔名
(3)設定content-disposition響應頭,控制瀏覽器以下載的方式開啟檔案
(4)獲取要下載的檔案的輸入流FileInputStream物件
(5)建立資料緩buffer衝區
(6)通過response物件獲取OutputStream輸出流物件
(7)將FileInputStream流物件寫入到buffer緩衝區
(8)使用OutputStream輸出流物件將buffer緩衝區資料輸出到客戶端瀏覽器

public class LoadServlet extends HttpServlet{
    /**
    * 載檔案,通過OutputStream輸出流 
    */
    public void doPost(HttpServletRequest request,HttpServletResponse response){
        //1.獲取要下載的檔案的絕對路徑
        String realPath = this.getServletContext().getRealPath("/load/ceshi.txt");
        //2.獲取要下載的檔名
        String fileName = realPath.subString(realPath.lastIndexOf("\\"
)+1); String userAgent = request.getHeader("User-Agent"); //針對IE或者以IE為核心的瀏覽器: if (userAgent.contains("MSIE")||userAgent.contains("Trident")) { fileName = java.net.URLEncoder.encode(fileName, "UTF-8"); } else { //非IE瀏覽器的處理: fileName = new String(fileName.getBytes("UTF-8"
),"ISO-8859-1"); } //3.設定content-disposition響應頭控制瀏覽器以下載的方式開啟檔案 response.setHeader("content-disposition","attachment;filename="+fileName); //4.獲取要下載的檔案輸入流 InputStream in = new FileInputStream(realPath); int len = 0; //5.建立書緩衝區 byte[] buffer = new byte[1024]; //6.通過response物件獲取OutputStream輸出流物件 OutputStream os = response.getOutputStream(); //7.將FileInputStream流物件寫入到buffer緩衝區 while((len=in.read(buffer))>0){ os.write(buffer,0,len); } //8.關閉流 in.close(); os.close(); } }

注意:
1、在檔名中含有中文編碼時,設定響應頭時需要使用URLEncoder.encode(fileName, “UTF-8”)方法進行編碼,否則容易出現中文亂碼的情況。
2、檔案輸出流物件應儘量使用OutputStream流物件,避免使用PrintWriter流物件。因為OutputStream是位元組流物件,可以處理任意型別的資料;而PrintWriter是字元流輸出物件,只能處理字元資料,如果用字元流處理位元組資料,就會導致資料丟失。