Struts 2ファイルのダウンロード中国語名の文字化けしの解決方法
2029 ワード
最近、Sturts 2を使ってファイルをダウンロードしたところ、異なるブラウザで中国語のファイル名が文字化けしている問題が発見され、バックアップを残すために解決方法をここに置いた.
struts 2プロファイルは次のとおりです.
FileDownloadAction.javaのファイル名で処理されるコードは次のとおりです(他のコードは無視されます).
ネット上では「ISO 8859-1」の符号化フォーマットを直接使用する問題が多く、検証されても問題をうまく解決できないのか、それともブラウザによって異なる符号化フォーマットを使用する必要があるのか、ブラウザの互換性の問題に心から葛藤している.
注意:ここでは3つの主流ブラウザ(ie 7+,firefox 8.0,chrome 18.0)のみが選択されており、他のブラウザはテストされていません.
struts 2プロファイルは次のとおりです.
<action name="fileDownLoad" class="com.test.FileDownloadAction">
<result name="download" type="stream">
<param name="contentType">application/pdf;charset=UTF-8</param>
<param name="contentDisposition">attachment;filename="${filename}.pdf"</param>
<param name="inputName">inputStream</param>
<param name="bufferSize">4096</param>
</result>
</action>
FileDownloadAction.javaのファイル名で処理されるコードは次のとおりです(他のコードは無視されます).
/**
* ,
*
* @param request
* @param name
*/
private String processFileName(HttpServletRequest request, String name)
throws UnsupportedEncodingException {
String filename = null;
String agent = request.getHeader("USER-AGENT");
if (null != agent){
if (-1 != agent.indexOf("Firefox")) {//Firefox
filename = "=?UTF-8?B?" + (new String(org.apache.commons.codec.binary.Base64.encodeBase64(name.getBytes("UTF-8"))))+ "?=";
}else if (-1 != agent.indexOf("Chrome")) {//Chrome
filename = new String(name.getBytes(), "ISO8859-1");
} else {//IE7+
filename = java.net.URLEncoder.encode(name, "UTF-8");
filename = StringUtils.replace(filename, "+", "%20");//
}
} else {
filename = name;
}
return filename;
}
ネット上では「ISO 8859-1」の符号化フォーマットを直接使用する問題が多く、検証されても問題をうまく解決できないのか、それともブラウザによって異なる符号化フォーマットを使用する必要があるのか、ブラウザの互換性の問題に心から葛藤している.
注意:ここでは3つの主流ブラウザ(ie 7+,firefox 8.0,chrome 18.0)のみが選択されており、他のブラウザはテストされていません.