1. 程式人生 > >springmvc 檔案下載中文檔名不顯示

springmvc 檔案下載中文檔名不顯示

獲得excel檔案流並下載的過程中,下載檔案中文名字是空白  (_     .xlsx )

@RequestMapping("/exportExcel")
    public void exportExcel(@RequestParam("token") String token,HttpServletResponse response){
        try {
            String jsonStr = (String) redisTemplate.opsForHash().get(token, "ticketList");
            List<LowFareFindTicketVO> list = JSON.parseArray(jsonStr, LowFareFindTicketVO.class);
            Workbook workbook = lowFareFindExcelService.writeExcelFile(list);
            String fileName = IdGenerator.getTimestamp()+ "_比較後結果.xlsx";
            //fileName = URLEncoder.encode(fileName,"utf-8");
            response.setHeader("Content-disposition","attachment; filename=" + fileName);
            response.setContentType("application/msexcel");
            ServletOutputStream servletOut = response.getOutputStream();
            workbook.write(servletOut);
        } catch (Exception e){
            logger.error("#",e);
        }
    }

原因:header中只支援ASCII 

解決辦法

在設定fileName的時候進行URL轉碼

fileName = URLEncoder.encode(fileName,"utf-8");

JS中解決URI 編碼問題:

encodeURI()  函式通過將特定字元的每個例項替換為一個、兩個、三或四轉義序列來對統一資源識別符號 (URI) 進行編碼 (該字元的 UTF-8 編碼僅為四轉義序列)由兩個 "代理" 字元組成)。

encodeURIComponent()是對統一資源識別符號(URI)的組成部分進行編碼的方法。它使用一到四個轉義序列來表示字串中的每個字元的UTF-8編碼(只有由兩個Unicode代理區字元組成的字元才用四個轉義字元編碼)。

引出:

為什麼要對URL進行編碼? 開啟

理解http協議中的編碼與解碼 參考 參考2