有关文件下载的文件名

文件的上传下载,上传的时候没有出现问题,可是使用火狐浏览器进行下载的时候出现了文件名的不完整, 空格不识别的状况。 这种状况下是在下载的时候对response的处理。 //将文件名作一个字符格式处理,转化成能够被火狐浏览器能够识别的文件名(例如部分中文) String fileName = new String(file.getFileName().getBytes("UTF-8"), "ISO-8859-1"); //设置响应头,加\“”能够处理文件名中中英文交互的状况 response.setHeader("Content-disposition","attachment;filename="" + fileName + """);chrome

其中过程当中看到一篇博客特别好 http://blog.csdn.net/zsmj_2011/article/details/47071331浏览器

博客部分:app

最近作项目,采用Spring MVC作控制层,下载文件的文件名老是在主流浏览器上显示乱码,Firfox不是乱码了,IE下又成了乱码。也是烦,IE老是独树一帜,没办法,只能让程序去适应,在网上也搜索了不少,可是解决的不理想,主要是IE11做为主流浏览器后,不少人以前提出的方案都失效了。 简单来讲,以前使用request获取header中的user-agent,经过MSIE关键字来判断是不是IE浏览器,若是是IE浏览器,使用utf-8对文件名编码就能够了。然而,IE11的user-agent已经没有了MSIE关键字了,下面就是IE11的request header:ide

User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; LCJB; rv:11.0) like Gecko 1 能够看出,MSIE关键字已经没有,可是我们还能够使用Trident关键字来判断 然而,我在使用win10上的Edge浏览器进行下载时,仍然是乱码,仔细看,原来Edge浏览器的user-agent又发生了变化,MSIE和Trident关键字都没有了,增长了Edge关键字,当前我用电脑仍是win8,这里就不贴出最新的Edge浏览器的request header了,感兴趣的能够进开发者模式看一下。编码

终极解决方案.net

好了,咱们如今须要使用Trident和Edge关键字来判断是不是微软的浏览器(微软抛弃了IE,开始使用Edge了),代码以下:code

public class HttpUtils { private static String[] IEBrowserSignals = {"MSIE", "Trident", "Edge"};blog

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

那么在下载时,首先判断是不是微软的浏览器,若是是,用utf-8对文件名进行编码,若是不是,使用万能解决乱码代码:开发

new String(fileName.getBytes("UTF-8"), "ISO-8859-1") 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-IE十一、Edge、Firefox和chrome浏览器下载文件时,中文字符再也不乱码了。

Firefox下载英文+中文组合的文件名的问题

另外,有一个须要注意的地方就是这句话:

response.setHeader("Content-disposition","attachment;filename="" + fileName + """); 1 设置response的Content-disposition项时,filename的值要加上双引号,若是不加双引号,在Firefox下载文件时,若是文件名是英文+中文的组合,好比:dota2的新手攻略.docx,这个文件在Firefox下载时,下载下来的文件名只有dota2了。只有加了双引号后,文件名才和代码设置的文件名一致。由于这个双引号是在字符串里,所需须要加反斜杠\来进行转义。

相关文章
相关标签/搜索