浏览器兼容性--IE11以及Edge等下载文件的中文名出现乱码
项目中有用到文件下载功能,之前在处理下载时对IE浏览器下文件下载名进行过处理,测试也没有问题,
但是功能上线后,业务反馈IE11文件下载文件名依然乱码。打印User-Agent字符串如下:
IE11 User-Agent字符串:Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
IE6~IE10版本的User-Agent字符串:Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.0; Trident/6.0)
一、后端修改
IE浏览器在IE11,更改了User-Agent字符串格式内容,所以针对IE11,做一下判断即可:(后端代码更改)
1 //下载文件,并处理文件名乱码 2 public void downloadFile(HttpServletRequest request,HttpServletResponse response){ 3 String path = request.getSession().getServletContext().getRealPath("/upload/文档1.doc"); 4 // path是根据日志路径和文件名拼接出来的 5 File file = new File(path); 6 //获取日志文件名称 7 String filename = file.getName(); 8 try { 9 //判断是否是IE11 10 Boolean flag= request.getHeader("User-Agent").indexOf("like Gecko")>0; 11 12 if (request.getHeader("User-Agent").toLowerCase().indexOf("msie") >0||flag){ 13 filename = URLEncoder.encode(filename, "UTF-8");//IE浏览器 14 }else { 15 //先去掉文件名称中的空格,然后转换编码格式为utf-8,保证不出现乱码, 16 //这个文件名称用于浏览器的下载框中自动显示的文件名 17 filename = new String(filename.replaceAll(" ", "").getBytes("UTF-8"), "ISO8859-1"); 18 //firefox浏览器 19 //firefox浏览器User-Agent字符串: 20 //Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0 21 } 22 InputStream fis = new BufferedInputStream(new FileInputStream(path)); 23 byte[] buffer; 24 buffer = new byte[fis.available()]; 25 fis.read(buffer); 26 fis.close(); 27 response.reset(); 28 response.addHeader("Content-Disposition", "attachment;filename=" +filename); 29 response.addHeader("Content-Length", "" + file.length()); 30 OutputStream os = response.getOutputStream(); 31 response.setContentType("application/octet-stream"); 32 os.write(buffer);// 输出文件 33 os.flush(); 34 os.close(); 35 } catch (IOException e) { 36 // TODO Auto-generated catch block 37 e.printStackTrace(); 38 } 39 }
二、前端修改
同时作为前端也需要有一个兼容IE的心。
只需要在中文前加上encodeURI函数,其他部门字符串拼接
$scope.commonWord = baseUrl+"/downloadFile.htm?objectId="+encodeURI('欢迎你加入我们手册')+".pdf&fileName="+encodeURI('欢迎你加入我们手册')+".pdf";