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中,这样下载才不会乱码,其他浏览器就需要改变编码就行了
这里适配中英文下载,主要是想记录下自己遇到的坑,写的比较简单