解决各大浏览器下载文件,文件名乱码的问题

使用IE8导出csv文件时文件名乱码了,查询资料后得到解决

简单来说,之前使用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了),代码如下(判断是否是ie浏览器如下):

添加一个方法以及一个常量

  
        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对文件名进行编码,如果不是,使用万能解决乱码代码:

response.setContentType("application/octet-stream");  
 boolean isMSIE = isMSBrowser(request);  
 if (isMSIE) {  
       //IE浏览器的乱码问题解决
       fileName = URLEncoder.encode(fileName, "UTF-8");  
  } else {  
	  //万能乱码问题解决
       fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");  
        }  
        response.setHeader("Content-disposition", "attachment;filename=\"" + fileName + "\""); 

 

这样就可以在目前IE8-IE11、Edge、Firefox和chrome浏览器下载文件时,中文字符不再乱码了。

 

 

ps:Firefox下载英文+中文组合的文件名的问题,注意这句话:

 

    response.setHeader("Content-disposition","attachment;filename=\"" + fileName + "\"");  


设置response的Content-disposition项时,filename的值要加上双引号,如果不加双引号,在Firefox下载文件时,如果文件名是英文+中文的组合,比如:dota2的新手攻略.docx,这个文件在Firefox下载时,下载下来的文件名只有dota2了。只有加了双引号后,文件名才和代码设置的文件名一致。因为这个双引号是在字符串里,所需需要加反斜杠\来进行转义。

转载自解决各大浏览器下载文件,文件名乱码的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值