解决各大浏览器下载文件乱码以及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又发生了变化,MSIETrident关键字都没有了,增加了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了。只有加了双引号后,文件名才和代码设置的文件名一致。因为这个双引号是在字符串里,所需需要加反斜杠\来进行转义。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-27 00:06:47

解决各大浏览器下载文件乱码以及Firefox下载文件名不全问题的相关文章

Amazon 解决下载文件乱码

Amazon 解决下载文件乱码 大家在做多个站点的时候,可能会遇到下载下来的报告文件出现乱码. 法国站点和意大利站点均会出现这样的情况,那怎么解决呢? 这是由于编码的问题而导致,在我们读取数据插入到本地数据库的时候,不妨先将格式转成对应国家能正确识别的格式. 在文档中也有看到. 还要一个问题需要说明,由于操作系统设置默认语言的原因,在小国家站点,我们下载下来的报告可能会出现乱码的情况.这种情况很正常,在调用接口的时候,也没有办法去解决直接下载就出现正常编码. 现在的方法是将下载下来的乱码文件,通

下载文件乱码问题

1.下载文件乱码问题     new String("免责声明.pdf".getBytes("utf-8"), "ISO-8859-1"): 2.图片转blog String path = request.getSession().getServletContext().getRealPath("/");                String a = picturename2.replace(              

解决Ubuntu和Windows的文件乱码问题(转载)

解决Ubuntu和Windows的文件乱码问题(debian也通用) 1.转换文件内容编码   Windows下天生的纯文本文件,其中文编码为GBK,在Ubuntu下显示为乱码,可以使用iconv命令进行转换:   iconv -f gbk -t utf8 source_file > target_file2.转换文件名编码   Windows下压缩的zip文件,在 Ubuntu下解开时,中文文件名会显示乱码,可以用convmv解决.   安装convmv:   sudo apt-get ins

php下载文件 强制任意文件格式下载

用php下载一些文件,一般就是为了隐藏文件的真实下载地址才需要这样,否则这样会增加服务器负担,不如直接提供软件的地址. 一个简单的php文件下载源代码,虽不支持断点续传等,但是可以满足一些常用的需求了.php下载文件其实用一个a标签就能实现,比如 <a href="web/magento-1.8.1.0.zip">magento-1.8.1.0.zip</a> .但是遇到一些浏览器能识别的格式,比如.txt,.html,.pdf等,再用<a href=&q

Microsoft Edge浏览器下载文件乱码修复方法

随着Windows10的普及,Microsoft Edge自带浏览器使用频率逐渐提升,在日常使用过程中我们会发现一个常规的问题是使用Edge进行日常文件下载的时候,N多情况下可能都是乱码,同样的下载链接在Chrome\Firefox\IE等等都是没有问题的,这就很尴尬了,今天简单介绍下处理方法,具体如下: 乱码问题: 处理方法: 1.热键Win + R打开运行栏,输入gpedit.msc打开组策略编辑器: 2.在本地组策略编辑器中定位 计算机配置--管理模板--Windows组件--Intern

ServletResponse下载文件乱码

借助于强大的搜索引擎和本地试验. 通常来说解决乱码两个方式: 1.把文件名(包括汉字)编码成UTF-8 String downloadOrigalFile = "测试文件乱码.xlsx"; String downloadFileName = java.net.URLEncoder.encode(downloadOrigalFile, "UTF-8"); response.setHeader("Content-Disposition", "

javaEE杂项 --下载文件乱码的不同解决方案

在下载文件时,常见的方法: public void getuseopdoc(HttpServletResponse response) throws Exception { try { String filename = "某某文件"; InputStream inputStream = getClass().getResourceAsStream("/doc/"+filename+".doc"); response.reset(); respo

springboot ResponseEntity&lt;byte[]&gt; 下载文件乱码

spring3以后添加httpMessageConverter消怎机制.其中可以通过org.springframework.http.ResponseEntity<byte[]>对象下载文件. pom文件如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocat

解决Ubuntu和Windows该文件乱码问题

1.转换文件内容编码 Windows在自然纯文本文件.当中国作为编码GBK,在Ubuntu下乱码,可以使用iconv命令转换: iconv -f gbk -t utf8 source_file > target_file 2.转换文件名称编码 Windows下压缩的zip文件,在 Ubuntu下解开时,中文文件名称会显示乱码.能够用convmv解决. 安装convmv: sudo apt-get install convmv 转换文件或文件夹: convmv -f gbk -t utf8 -r