前言
有時候項目裏需要下載文件的功能,但是一時之間不知道從何下手,故此記錄。
一、使用HttpServletResponse
最簡單方便的便是使用HttpServletResponse,設置一下請求頭,獲取到輸出流。
public static void download(HttpServletRequest request, HttpServletResponse response)throws Exception {
String fileName = "要下載的文件的名字";
String filePath = "要下載的文件在服務器的存儲地址";
//設置響應頭和客戶端保存文件名
response.setCharacterEncoding("utf-8");
response.setContentType("multipart/form-data");
response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
//打開本地文件流
InputStream in = new FileInputStream(filePath);
//激活下載操作
OutputStream os = response.getOutputStream();
try {
//循環寫入輸出流
byte[] b = new byte[2048];
int length;
while ((length = in.read(b)) > 0) {
os.write(b, 0, length);
}
} catch (Exception e){
throw e;
} finally {
os.close();
in.close();
}
}
二、使用ResponseEntity
使用方法基本一樣,就是稍微簡介了一些,也可以下載byte數組。
public ResponseEntity<Object> download(HttpServletRequest request)throws Exception{
byte[] data = "獲取到的byte數組,也可以是輸入流讀取來的";
String fileName = "文件名字";
//設置響應頭
HttpHeaders headers = new HttpHeaders();
headers.setCacheControl("no-cache, no-store, must-revalidate");
//防止中文亂碼
headers.setContentDispositionFormData("attachment",new String(fileName.getBytes("UTF-8"), "iso-8859-1"));
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//headers.setContentLength(file.getContentLength());
headers.setPragma("no-cache");
return new ResponseEntity<Object>(data, headers, HttpStatus.CREATED);
}
寫在最後的話
這兩種下載方式各有優缺點吧,ResponseEntity比較簡潔一些,但是是一種一次性讀取的下載方式,下載太大文件會導致內存溢出。使用response對下載的文件大小無限制(循環讀取一定量的字節寫入到輸出流中,因此不會造成內存溢出,但是在下載人數過多的時候應該還是出現一些異常)。