1、
文件下載是web項目中常用的服務,在springmvc中常用ResponseEntity類來事項文件下載
2、ResponseEntity
ResponseEntity類實現響應頭、文件數據(以字節存儲)、狀態封裝在一起交給瀏覽器處理以實現瀏覽器的文件下載。簡單的說ResponseEntity可以折這HttpHeaders和HttpStatus,通過對HttpHeaders和HttpStatus的設置可以使瀏覽器執行下載操作。
3、實現文件下載
步驟:
- 獲取到文件的存放的真實路徑
- 根據接收到的文件名和文件真實路徑創建文件實例(注意:這里不是創建一個文件,而是創建一個File型的實例)
- 設置響應頭Content-Disposition瀏覽器根據這個響應頭執行相應的操作和要下載的文件名
- 設置響應內容的MIME類型,以二進制流形式傳輸
- 返回ResponseEntity
具體代碼:
@RequestMapping("/download")
public ResponseEntity<byte[]> download(@RequestParam("fileName") String fileName, HttpServletRequest req)
throws IOException {
// 獲取文件存放的真實路徑
String realPath = req.getServletContext().getRealPath("/WEB-INF/file");
//創建文件實例
File file = new File(realPath, fileName);
//修改文件名的編碼格式
String downloadFileName = new String(fileName.getBytes("UTF-8"), "UTF-8");
//設置httpHeaders,使瀏覽器響應下載
HttpHeaders headers = new HttpHeaders();
//告訴瀏覽器執行下載的操作,“attachment”告訴了瀏覽器進行下載,下載的文件 文件名為 downloadFileName
headers.setContentDispositionFormData("attachment", downloadFileName);
//設置響應方式為二進制,以二進制流傳輸
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
}
4、火狐瀏覽器測試
從圖中我們可以看到,我們設置的Content-Disposition起效果,傳輸類型也為二進制。