HttpServletResponse物件實現檔案下載
阿新 • • 發佈:2019-01-06
檔案下載在我們的專案中是很常見的需求,實現檔案下載功能的方式有很多,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是字元流輸出物件,只能處理字元資料,如果用字元流處理位元組資料,就會導致資料丟失。