浏览器兼容性--IE11以及Edge等下载文件的中文名出现乱码,前后端解决方案

项目中有用到文件下载功能,之前在处理下载时对IE浏览器下文件下载名进行过处理,测试也没有问题,但是功能上线后,业务反馈IE11文件下载文件名依然乱码。打印User-Agent字符串如下:

IE11 User-Agent字符串:Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like GeckoIE6~IE10版本的User-Agent字符串:Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.0; Trident/6.0)

一、后端修改

IE浏览器在IE11,更改了User-Agent字符串格式内容,所以针对IE11,做一下判断即可:(后端代码更改)

= request.getSession().getServletContext().getRealPath("/upload/文档1.doc" File file = String filename = Boolean flag= request.getHeader("User-Agent").indexOf("like Gecko")>0 </span><span style="color: #0000ff;"&gt;if</span> (request.getHeader("User-Agent").toLowerCase().indexOf("msie") >0||<span style="color: #000000;"&gt;flag){ filename </span>= URLEncoder.encode(filename,"UTF-8");<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;IE浏览器</span> }<span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt; { </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;先去掉文件名称中的空格,然后转换编码格式为utf-8,保证不出现乱码,</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;这个文件名称用于浏览器的下载框中自动显示的文件名</span> filename = <span style="color: #0000ff;"&gt;new</span> String(filename.replaceAll(" ","").getBytes("UTF-8"),"ISO8859-1"<span style="color: #000000;"&gt;); </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;firefox浏览器 </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;firefox浏览器User-Agent字符串: </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0</span>

<span style="color: #000000;"> }
InputStream fis = <span style="color: #0000ff;">new BufferedInputStream(<span style="color: #0000ff;">new<span style="color: #000000;"> FileInputStream(path));
<span style="color: #0000ff;">byte<span style="color: #000000;">[] buffer;
buffer = <span style="color: #0000ff;">new <span style="color: #0000ff;">byte<span style="color: #000000;">[fis.available()];
fis.read(buffer);
fis.close();
response.reset();
response.addHeader("Content-Disposition","attachment;filename=" +<span style="color: #000000;">filename);
response.addHeader("Content-Length","" +<span style="color: #000000;"> file.length());
OutputStream os =<span style="color: #000000;"> response.getOutputStream();
response.setContentType("application/octet-stream"<span style="color: #000000;">);
os.write(buffer);<span style="color: #008000;">//<span style="color: #008000;"> 输出文件
<span style="color: #000000;"> os.flush();
os.close();
} <span style="color: #0000ff;">catch<span style="color: #000000;"> (IOException e) {
<span style="color: #008000;">//<span style="color: #008000;"> TODO Auto-generated catch block
<span style="color: #000000;"> e.printStackTrace();
}
}

二、前端修改

同时作为前端也需要有一个兼容IE的心。

encodeURI函数,将其他部分字符串拼接。

encodeURI()是Javascript中真正用来对URL编码的函数。

它着眼于对整个URL进行编码,因此除了常见的符号以外,对其他一些在网址中有特殊含义的符号“; / ? : @ & = + $,#”,也不进行编码。编码后,它输出符号的utf-8形式,并且在每个字节前加上%。

<div class="cnblogs_code">

 $scope.commonWord = baseUrl+"/downloadFile.htm?objectId="+encodeURI('欢迎你加入我们手册')+".pdf&fileName="+encodeURI('欢迎你加入我们手册')+".pdf";

本来在测试和预生产上都OK,发线上版本之后上突然发现IE11下的不同

我的这个IE11的版本出现这个问题--中文乱码的问题。

 但是在其他版本的IE11居然可以正常下载。

我勒个去

IE居然还在不同的版本之间出现这个问题。你让我怎么兼容。

自己又想了一下,还有可能是不同的win系统下的IE11也会出现不同。

最后后端的修改,完美的解决了这个问题;

之前的是

,"ISO8859-1"));

修改之后:

= = = response.setContentType("multipart/form-data" </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;2.设置文件头:最后一个参数是设置下载文件名(假如我们叫a.pdf)</span> <span style="color: #ff0000;"&gt;<strong> response.setHeader("Content-Disposition","attachment;fileName=" + new String(fileName.getBytes("gb2312"),"ISO8859-1")); </strong></span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 通过文件路径获得File对象(假如此路径中有一个download.pdf文件)</span> file = <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; File(fullPath); in </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; FileInputStream(file); </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 3.通过response获取ServletOutputStream对象(out)</span> out =<span style="color: #000000;"&gt; response.getOutputStream(); </span><span style="color: #0000ff;"&gt;int</span> len = 0<span style="color: #000000;"&gt;; </span><span style="color: #0000ff;"&gt;byte</span>[] buffer = <span style="color: #0000ff;"&gt;new</span> <span style="color: #0000ff;"&gt;byte</span>[1024<span style="color: #000000;"&gt;]; </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 循环将输入流中的内容读取到缓冲区当中</span> <span style="color: #0000ff;"&gt;while</span> ((len = in.read(buffer)) > 0<span style="color: #000000;"&gt;) { </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 输出缓冲区的内容到浏览器,实现文件下载</span> out.write(buffer,0<span style="color: #000000;"&gt;,len); } } </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (Exception e) { logger.error(</span><span style="color: #0000ff;"&gt;new</span> StringBuilder("CustomServiceController -> createDownloadFileResponse Error:" + "构建附件下载回执出现异常,异常信息为:"<span style="color: #000000;"&gt;).append(e).toString()); } </span><span style="color: #0000ff;"&gt;finally</span><span style="color: #000000;"&gt; { </span><span style="color: #0000ff;"&gt;if</span> (in != <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;) { in.close(); } </span><span style="color: #0000ff;"&gt;if</span> (out != <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;) { out.close(); out.flush(); } </span><span style="color: #0000ff;"&gt;if</span> (file != <span style="color: #0000ff;"&gt;null</span> &amp;&amp;<span style="color: #000000;"&gt; file.exists()) { file.delete(); } } } </span><span style="color: #008000;"&gt;/*</span><span style="color: #008000;"&gt; * 判断是否是ie浏览器如下 </span><span style="color: #008000;"&gt;*/</span> <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;boolean</span><span style="color: #000000;"&gt; isMSBrowser(HttpServletRequest request) { String userAgent </span>= request.getHeader("User-Agent"<span style="color: #000000;"&gt;); </span><span style="color: #0000ff;"&gt;for</span><span style="color: #000000;"&gt; (String signal : IEBrowserSignals) { </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; (userAgent.contains(signal)) </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;true</span><span style="color: #000000;"&gt;; } </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;false</span><span style="color: #000000;"&gt;; }</span></pre>

为什么会出现这种情况:

因为在前端页面已经将中文字符,encodeURI编码转换成utf-8,但是在发送ajax异步请求的时候,IE浏览器总会采用GB2312编码方式(操作系统默认的方式),所以在后端拿到字符串的时候是gb2312编码之后的字符串,所以后端还是需要的是对gb2312编码的字符串进行解码,而不是对utf-8的字符进行解码。

总结一下:

js中url编码&传的值给其他的页面,多参数网址作为整体编码后传值。比如说是&符号是特殊符号不能直接传递,需要经过编码以后才能传递。

1、网址路径的编码,用的是utf-8编码;

使用的是chrome浏览器

当我使用IE11的浏览器,查看HTTP请求的头信息,会发现IE实际查询的网址是“http://www.cnblogs.com/chengxs/%E7%A8%8B%E6%96%B0%E6%9D%BE”。也就是说,IE自动将“程新松”编码成了“%E7%A8%8B%E6%96%B0%E6%9D%BE”。在每个字节前加上%而得到的。

我把chrome浏览器的url复制到IE上,就出现了如下图所示的:

2、查询字符串的编码,用的是操作系统的默认编码。

3、GET和POST方法的编码,用的是网页的编码。

4、在Ajax调用中,IE总是采用GB2312编码(操作系统的默认编码),而Firefox总是采用utf-8编码。

欢迎访问:

1、云商城isv系统

 2、云商城消费者门户

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


问题背景 最近小伙伴提了一个希望提高后台下拉列表可操作性的需求,原因是下拉列表选项过多,每次下拉选择比较费时费力且容易出错,硬着头皮啃了啃前端知识,网上搜寻了一些下拉列表实现的资料,这里总结一下。 P
// n位随机数生成 function randomNum(n) { let sString = &quot;&quot;; let strings = &quot;abcdefghijklmnopq
HTML是HyperText Markup Language的简称,中文名称:超文本标记语言,它是一种用于创建网页的 标准标记语言
层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。
JavaScript 是脚本语言,是一种解释性脚本语言(代码不进行预编译)
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 一名开发者或设计师通常可以在一秒内指出优秀的设计,但对于糟糕的设计只需最多半
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 Excel是我们办公中常用的工具 ,它几乎能为我们处理大部分数据,友好的交互
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/8-tips-for-an-awesome-sign
本文由葡萄城技术团队于博客园翻译并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 如果我们自己编写从URL中分析和提取元素的代码,那么有可能会比较痛苦
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/what-is-deno-and-will-it-r
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/4-reasons-to-use-sass-in-y
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/vuejs-3-0-0-beta-features-
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/sessionstorage-and-localst
一直以来,JavaScript使用数组和对象来定义和存放结构化数据, 在这篇文章中,我们将一起深挖另一种对象Map的一切,我们将会去了解它是什么、如何遍历、都包括什么属性和方法以及优缺点是什么。
由于CSS的出现,现在的网站风格已经与它们很早之前的样子有了很大的不同。CSS的出现为原本平平无奇的网页注入了活力。这也是网站的用户体验得到进一步进化的原因。这可能就是当今几乎所有的网站或多或少都在使
自苹果推出了iPhone应用商店以来,App成为了我们生活中不可或缺的一部分,而对于实体业务也是如此,现在各行业都在推出自己的App,但有没有人想过这样一种场景,如果自己的潜在客户还没有安装你的App
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/10-top-chrome-extensions-f
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/do-your-buttons-lead-or-mi
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前段时间在开发【葡萄城社区】公众号时有一个功能是需要用网页授权认证地址生成二
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 HTML5的发展改变了互联网技术趋势,前端热度依旧不减,所以对于应用开发人员