1. 程式人生 > >SpringMvc 檔案下載 詳解

SpringMvc 檔案下載 詳解

/** * 檔案下載 * 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);}