java web中文名文件下載亂碼處理

ie,edge,chrome瀏覽器中文名文件下載亂碼問題處理

在網上查閱資料,以及根據自己這邊實際的需求,來解決編碼問題,以及在edge遇到的坑,不同的瀏覽器針對編碼也不一樣,做一次轉碼就順利解決問題了,直接上代碼

    @ApiOperation(value = "批量合成導出音頻下載", notes = "批量合成導出音頻下載")
    @RequestMapping(value = "/expoxt/download/file", method = RequestMethod.GET)
    @ApiImplicitParams({
            @ApiImplicitParam(name = "filePath", value = "返回的文件名", dataType = "int", paramType = "query", example = "1.zip", required = true),
            @ApiImplicitParam(name = "taskName", value = "任務Name", dataType = "string", paramType = "query", required = true)
    })
    public ResponseEntity<byte[]> audioDetailTemplateDownloadZip(HttpSession session,String filePath,String taskName, HttpServletRequest request) throws Exception {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        String userAgent = request.getHeader("User-Agent");
        String fileName = taskName + ".zip";;
        if (userAgent.contains("Edge")) {
            //edge瀏覽器
            fileName = URLEncoder.encode(fileName, "utf-8");
            headers.add("Content-disposition", "attachment;filename="+fileName);
        } else if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
            //IE瀏覽器處理
            headers.add("Content-disposition", "attachment;filename="+new String(fileName.getBytes("gb2312"), "iso-8859-1"));
        } else {
            //非IE、edge瀏覽器的處理
            headers.add("Content-disposition", "attachment;filename="+new String(fileName.getBytes("utf-8"), "iso-8859-1"));
        }
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(new File(filePath)), headers, HttpStatus.OK);
    }

taskName,前端那邊傳過來的時候已經做了編碼,框架是ssm,打斷點查看taskName接收到的值已經解碼了,這應該是框架本身解碼了,這裏特別注意的是edge瀏覽器,他的中文名需要在編碼一次,然後放到header中,這樣下載纔不會亂碼,其他瀏覽器就需要改變編碼就行了

這裏適配中英文下載,主要是想記錄下自己遇到的坑,寫的比較簡單

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章