FireFox浏览器导出文件名乱码,原因剖析与解决

1,498 阅读1分钟
原文链接: blog.csdn.net

今天在使用poi导出excle表格过程中,QA提出firefox浏览器导出时,文件名乱码,自身分析结合度娘,大致了解原因如下:

文件名存在http header中的filename,Content-Disposition: attachment; filename=FILENAME,该filename参数可用于为浏览器下载资源的文件的名称提供建议。但是,RFC 2183中声明文件名只能使用US-ASCII字符,目前大多数流行的Web浏览器似乎允许非US-ASCII字符(由于缺乏标准)在编码方案和文件名的字符集规范上不同意。那么问题是,如果文件名“naïvefile”(没有引号和第三个字母是U + 00EF)需要编码到Content-Disposition头文件中。

按照 rfc231 , Content-Disposition 应该按照如下格式设置:

"Content-Disposition","attachment;filename*=utf-8'zh_cn'文件名.xx"

只要严格按照标准设置以后,自然在各种浏览器下都会正常运行

解决方案:

1、根据浏览器不同,若是firefox,则严格按照标准处理

String codedFileName = "导出文件名.xls";
String agent = request.getHeader("USER-AGENT");
            if(agent != null && agent.toLowerCase().indexOf("firefox") > 0)
            {
                codedFileName = "=?UTF-8?B?" + (new String(Base64Utils.encodeToString(codedFileName.getBytes("UTF-8")))) + "?=";
            } else {
                codedFileName =  java.net.URLEncoder.encode(codedFileName, "UTF-8");
            }
            response.setHeader("Content-Disposition", "attachment;filename=" + codedFileName);

2、统一使用filename*=utf-8’zh_cn’文件名.xx的标准(简洁)

String codedFileName = "导出文件名.xls";
response.setHeader("Content-Disposition", "attachment;filename*=utf-8'zh_cn'" + codedFileName);

建议使用后者