今天在使用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);
建议使用后者