Struts 2ファイルのダウンロードと中国語の文字化け問題の解決案
4564 ワード
ソース:http://www.iteye.com/topic/699246
一、struts.xmlファイル
<struts>
<package name="crud-default" extends="convention-default">
<action name="download" class="com.myweb.download.DownLoadAction">
<!--type stream StreamResult -->
<result name="success" type="stream">
<!-- text/plain-->
<param name="contentType">application/x-msdownload;charset=ISO8859-1</param>
<!-- inputStream, StreamResult inputName getter ,
getInputStream() , Action -->
<param name="inputName">inputStream</param>
<!-- inline( ), attachment ,filename
, , download.action -->
<param name="contentDisposition">attachment;filename="${fileName}"</param>
<!-- -->
<param name="bufferSize">4096</param>
</result>
</action>
</package>
</struts>
二、comp.myweb.download.Down LoadAction のファイルコード
public class DownLoadAction extends ActionBase {
private Logger logger = LoggerFactory.getLogger(DownLoadAction.class);
private String fileName = null;
public String execute() throws Exception {
return "success";
}
public InputStream getInputStream() {
this.fileName = json.substring(json.lastIndexOf("\\") + 1, json.length());
return Struts2Utils.getSession().getServletContext().getResourceAsStream(json);
}
public String getFileName() {
try {
Struts2Utils.getResponse().setHeader("charset","ISO8859-1");
return new String(this.fileName.getBytes(), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
return " !";
}
}
}
発生した問題:ファイルはダウンロードできますが、websphere環境でダウンロードしたファイルの中国語名は文字化けしています.問題を解決する手順は以下の通りです.
まず、struts.xmlファイルを修正しました.
第二に、Down LoadAction.javaファイルのget FileName方法を修正しました.
public String getFileName() {
try {
return new String(this.fileName.getBytes(), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
return " !";
}
}
新しいポップアップIEウィンドウでは、最初のダウンロード時に、ダウンロードメッセージボックスの中国語は依然として文字化けで、再度ダウンロードすれば、正常に中国語が表示されます.アプリケーションパッケージ全体のデフォルトコードはUTF-8です.最初にダウンロードした後、クライアントブラウザのデフォルトコードはISO 8859-1に変更されました.再度中国語をダウンロードすれば正常に表示されます.この時、IEブラウザの文字セットコードは西欧ISOです.
上の図に示すように、ブラウザのデフォルトコードはUTF-8から西欧ISOに変更されました.今回の初めてのダウンロード時に文字化けが発生した問題をどう解決しますか?第三に、Down LoadAction.javaファイルのget FileName方法を引き続き修正する.
public String getFileName() {
try {
// http Header,
Struts2Utils.getResponse().setHeader("charset","ISO8859-1");
return new String(this.fileName.getBytes(), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
return " !";
}
}
添付:全体的にUTF-8に変更した場合、逆に「未知のファイル名」というエラーメッセージが表示されます.http要求でデフォルトのコードはISO 8859-1である可能性があります.