FireFox瀏覽器匯出檔名亂碼,原因剖析與解決
阿新 • • 發佈:2019-01-07
今天在使用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);
建議使用後者