欢迎光临
一个废柴的博客

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

logo-firefox.png

今天在使用poi导出excel表格过程中,导出excel文件,除了火狐浏览器(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);

建议使用后者。

参考文章:https://blog.csdn.net/bylhjcsmmd/article/details/78284736 ;

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址