1. 程式人生 > >SpringMvc 文件下載 詳解

SpringMvc 文件下載 詳解

ioe stat get mapping 發現 結果 string 返回 resp



  最近SSM 需要用到文件下載,以前沒用過,在百度上找了好久發現沒有一篇博客,對於此段代碼進行詳細講解,

  這裏是本人的個人總結,跟大家分享一下!!!不謝


/**
* 文件下載
* ResponseEntity:該類實現響應頭、文件數據(以字節存儲)、狀態封裝在一起交給瀏覽器處理以實現瀏覽器的文件下載
* <p>
* ResponseEntity 也可作為響應數據使用 與@ResponseBody 註解功能相似
* 但是ResponseEntity的優先級高於@ResponseBody
* 在不是ResponseEntity的情況下才去檢查有沒有@ResponseBody註解。
* 如果響應類型是ResponseEntity可以不寫@ResponseBody註解,寫了也沒有關系。
* <p>
* 簡單粗暴的講,個人理解:
* @ResponseBody可以直接返回Json結果,
* @ResponseEntity不僅可以返回json結果,還可以定義返回的HttpHeaders和HttpStatus
*/
@RequestMapping("/download")
public ResponseEntity<byte[]> download(HttpServletRequest request, @RequestParam String filename) throws IOException {
//文件所在位置
String downloadFilePath = request.getSession().getServletContext().getRealPath("/uploud");
//獲取要下載的文件
File file = new File(downloadFilePath, filename);

//http頭信息 設置一些約束之類的東西
HttpHeaders headers = new HttpHeaders();
//設置編碼 為了解決中文名稱亂碼問題
String downloadFileName = new String(filename.getBytes("UTF-8"), "iso-8859-1");
//將編碼加到http頭信息中
headers.setContentDispositionFormData("attachment", downloadFileName);
/**
* MediaType:互聯網媒介類型
* contentType:具體請求中的媒體類型信息
* MediaType: 很多常量 多種類型可設置
* APPLICATION_OCTET_STREAM:二進制流數據(如常見的文件下載)
*
* 還有一種常見的:
* MULTIPART_FORM_DATA: 需要在表單中進行文件上傳時,就需要使用該格式
*/
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
/**
* FileUtils.readFileToByteArray:讀取文件到字節數組
*
* CREATED:201狀態碼:創建
*
* 簡而言之,個人理解:
* 創建/下載 一個根據http頭信息約束的 字節數組(文件)
*/
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);

}

SpringMvc 文件下載 詳解