- - PR -
struts1.2でfileupload時に通常のパラメータが文字化け
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-08-30 23:18
WAS6にてstruts1.2を導入して開発しています。
HTMLフォームから日本語のパラメータを文字化けしないようにするためにWASに default.client.encoding=Cp943C の設定を行い、これまでうまくいっていました。 ところが、fileuploadのプログラムを開発したところ、ファイル名は文字化けしていないのですが、ファイル以外の通常のパラメータが文字化けしてしまいます。 そこで、文字化けするパラメータを new String(s.getBytes("iso-8859-1"), "Cp943C"); としてあげると文字化けが解消されました。 ちなみにパラメータは、DynaActionFormで取得しています。 まず、なぜこういったことが起きるのかが疑問なのと、プログラムではなく設定などで解決する方法はないでしょうか? |
|
投稿日時: 2005-09-01 07:17
WASは、使った事がないのでわかりませんが、
サーブレットフィルターでリクエストの文字コードを設定されてはいかがでしょうか。 具体的には、以下の様なフィルタークラスを作成する。 package filter; .... public class CodeFilter implements Filter{ public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain)throws IOException, ServletException { request.setCharacterEncoding("cp943c"); chain.doFilter(request,response); } } web.xmlにフィルターを登録する。 <filter> <filter-name>Encoding</filter-name> <filter-class>filter.CodeFilter</filter-class> </filter> <filter-mapping> <filter-name>Encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 時間がないので、今は調べきれていませんが、strutsでマルチパートリクエスト の場合にどこで文字変換が、どのようなルールで行われているかがわかればもっと よい対処があるかもしれません。 有識者の方、ご教授ください。 |
|
投稿日時: 2005-09-02 09:58
つばささん、ありがとうございます。
その後いろいろと調べましていくつか分かりました。 マルチパートリクエストのパラメータは、request.getCharacterEncoding()がnullでない場合はその文字コードでエンコードされます。nullの場合はISO-8859-1でエンコードされます。 この処理はorg.apache.struts.upload.CommonsMultipartRequestHandler#addTextParameter(HttpServletRequest, FileItem)で行われています。 そこで今回の現象を見てみると、マルチパートリクエストの場合だけgetCharacterEncoding()の結果がnullであることが分かりました。 ということはその値をCp943Cにしてあげればいいのですが、方法としてはつばささんのご提案の通り、ServletFilterしかないのかなと思っています。 実際試したらうまくいきました。 そもそもWASの設定(default.client.encoding)でCp943Cを設定しているので、なぜマルチパートの時だけ文字コードがnullになってしまうのかという点は不明です。 ServletFilterの対応ですとWASの設定とServletFilterの設定で二箇所にCp943Cを記述しなければいけないのがいまいち腑に落ちないのですが、今回はこの対応で行きたいと思います。 |
1