解决各大浏览器下载文件乱码以及Firefox下载文件名不全问题
最近做项目,采用Spring MVC做控制层,下载文件的文件名总是在主流浏览器上显示乱码,Firfox不是乱码了,IE下又成了乱码。也是烦,IE总是独树一帜,没办法,只能让程序去适应,在网上也搜索了很多,但是解决的不理想,主要是IE11作为主流浏览器后,很多人之前提出的方案都失效了。
简单来说,之前使用request获取header中的user-agent,通过MSIE关键字来判断是否是IE浏览器,如果是IE浏览器,使用utf-8对文件名编码就可以了。然而,IE11的user-agent已经没有了MSIE关键字了,下面就是IE11的request header:
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; LCJB; rv:11.0) like Gecko
可以看出,MSIE关键字已经没有,但是咱们还可以使用Trident关键字来判断
然而,我在使用win10上的Edge浏览器进行下载时,仍然是乱码,仔细看,原来Edge浏览器的user-agent又发生了变化,MSIE和Trident关键字都没有了,增加了Edge关键字,当前我用电脑还是win8,这里就不贴出最新的Edge浏览器的request header了,感兴趣的可以进开发者模式看一下。
终极解决方案
好了,我们现在需要使用Trident和Edge关键字来判断是否是微软的浏览器(微软抛弃了IE,开始使用Edge了),代码如下:
public class HttpUtils {private static String[] IEBrowserSignals = {"MSIE", "Trident", "Edge"};public static boolean isMSBrowser(HttpServletRequest request) {String userAgent = request.getHeader("User-Agent");for (String signal : IEBrowserSignals) {if (userAgent.contains(signal))return true;}return false;}
}
那么在下载时,首先判断是否是微软的浏览器,如果是,用utf-8对文件名进行编码,如果不是,使用万能解决乱码代码:
new String(fileName.getBytes("UTF-8"), "ISO-8859-1")
那么咱们总结一下,最终的下载代码如下:
response.setContentType("application/octet-stream");boolean isMSIE = HttpUtils.isMSBrowser(request);if (isMSIE) {fileName = URLEncoder.encode(fileName, "UTF-8");} else {fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");}response.setHeader("Content-disposition", "attachment;filename=\"" + fileName + "\"");//剩下的就是将文件流输出到response
这样就可以在目前IE8-IE11、Edge、Firefox和chrome浏览器下载文件时,中文字符不再乱码了。
Firefox下载英文+中文组合的文件名的问题
另外,有一个需要注意的地方就是这句话:
response.setHeader("Content-disposition","attachment;filename=\"" + fileName + "\"");
设置response的Content-disposition项时,filename的值要加上双引号,如果不加双引号,在Firefox下载文件时,如果文件名是英文+中文的组合,比如: dota2的新手攻略.docx ,这个文件在Firefox下载时,下载下来的文件名只有 dota2 了。只有加了双引号后,文件名才和代码设置的文件名一致。因为这个双引号是在字符串里,所需需要加反斜杠\来进行转义。
解决各大浏览器下载文件乱码以及Firefox下载文件名不全问题相关推荐
- python selenium 实现在火狐浏览器上下载文件(涉及firefox下载文件相关的配置)
在这个案例中最重要也是我花了主要精力解决的问题就是火狐浏览器下载文件时会自动弹出下载弹框的这个问题. 解决这个问题可以参照以下步骤(本次案例中要下载的文件格式为dotx文件,如果有其他格式的文件要修改 ...
- Microsoft Edge浏览器下载文件乱码修复方法(二)
之前有写过"Microsoft Edge浏览器下载文件乱码修复方法",发现很多情况下下载文件乱码问题还是存在,这里对之前内容做简单补充,希望可以帮到大家. 方法二: 默认如果提示下 ...
- Safari浏览器下载word文件,后缀多拼接了.html,导致打开下载文件乱码
1.遇到的问题 谷歌和ie下载文件正常 Safari浏览器下载word文件,后缀多拼接了.html,导致打开下载文件乱码,下载的文件名称为test.doc.html,手动去掉多余的后缀.html即可正 ...
- 解决各大浏览器兼容问题hack方法总结
解决各大浏览器兼容问题hack,IE6/ IE7/ IE8/ IE9/ Firefox/ Opera/ Webkit/ Chrome/ Safari. 方法一 1 color:red; /* 所有浏览 ...
- 上传文件正常,下载文件查看失败,下载文件大小为0kb
上传文件正常,下载文件查看失败,下载文件大小为0kb 首先查看前台传进来的文件名与目录下的文件名是否一致,其次查看下载文件路径是否正确. 我的多出来个日期文件夹 is = new FileInputS ...
- 解决Mac上打开txt文件乱码问题
解决Mac上打开txt文件乱码问题 参考文章: (1)解决Mac上打开txt文件乱码问题 (2)https://www.cnblogs.com/chester-cs/p/11784079.html ( ...
- Android下载文件(一)下载进度断点续传
Android下载文件(一)下载进度&断点续传 索引 Android下载文件(一)下载进度&断点续传 Android下载文件(二)单任务多线程并发&断点续传(待续) Andro ...
- wget命令下载文件并另存为不同的文件名
本文翻译自:wget command to download a file and save as a different filename I am downloading a file using ...
- python 下载文件-python爬虫之下载文件的方式总结以及程序实例
python爬虫之下载文件的方式以及下载实例 目录 第一种方法:urlretrieve方法下载 第二种方法:request download 第三种方法:视频文件.大型文件下载 实战演示 第一种方法: ...
最新文章
- JVM---程序计数器
- 戏说肥哥系列之---买车
- Java基础 this关键字
- 当 Kubernetes 遇到机密计算,阿里巴巴如何保护容器内数据的安全?
- CNN中的卷积操作与权值共享
- mysql sequence java_MySQL增加Sequence管理功能
- PHP5: mysqli 插入, 查询, 更新和删除 Insert Update Delete Using mysqli (CRUD)
- OpenLTE 基站相关头文件:用户、定时器、基站接口、消息接口
- yii mysql 操作_YII 数据库相关操作
- 2020湖南省技能竞赛获奖名单_高光时刻!肇庆市中等职业学校学生专业技能竞赛获奖名单公布~...
- 椭圆形中间一个大写的v_Shift键在 Word 中的 9 个经典操作,第一个你可能就不知道!【Word教程】...
- Spring Boot设置指定包的日志级别
- ctf攻防渗透-加密-栅栏密码
- 多元回归的拟合优度:R^2
- vbs整人代码,表白+提醒 两段代码就OK
- phpstudy快速搭建网站步骤(手把手教你搭建)
- 线性规划中的对偶(Duality in linear programs)
- PMP-计算题汇总(PV、EV、AC、BAC、EAC、ETC、)
- 什么是NFT?你不会还不知道吧!
- 2016集训队论文姜志豪
热门文章
- string类型的pdf文件转为pdf
- 公务员学python有什么用_未来公务员都会是数据分析高手了,你还要当个只会Excel的小白吗?...
- 第一载、初识操作系统
- Dynamics 365Online 如何从APP Source中下载APP
- Springboot毕设项目基于J2EE的青年志愿者系统uo221(java+VUE+Mybatis+Maven+Mysql)
- PHP 源码学习之线程安全
- Centos7.5搭建本地Yum源【2022最新--保姆级部署】
- 性能测试工具-腾讯GT
- 迅雷深度布局家庭互联网
- 逻辑编排在优酷可视化搭建中的实践之上