SpringMvc 檔案下載 詳解
阿新 • • 發佈:2018-12-11
/** * 檔案下載 * 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);}