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中,這樣下載纔不會亂碼,其他瀏覽器就需要改變編碼就行了
這裏適配中英文下載,主要是想記錄下自己遇到的坑,寫的比較簡單