[Seasar-user:2879] s2struts1.2.0 でのファイルアップロードについて

Hikaru Taniguchi taniguchi
2005年 11月 21日 (月) 15:48:21 JST


たにぐちです.

S2Struts 1.2.0を使ってWebアプリを作ってるところです。

利用者がファイルをアップロードして、これを受け取ってサーバ側で処理する
必要があるのですが、うまくいかないので相談させてください。

<前提>
  環境:Windows2000上で Tomcat5.5 + S2Struts1.2.0 + Seasar2.3.1 + JDK5U5
1. フォームは PojoなDtoクラスを作った
2. ファイルの受取りは Struts(とcommons-fileupload)に倣い、FormFileな
   フィールドを作成し、セッタ/ゲッタを作った
3. アップロード元画面は enctype=multipart/form-data とした。

<現象>
フォームのDtoに値がセットされない

<調査内容>
AcceptorImplの65行目、66行目、73行目から populate系のメソッドが走りま
す。この中で、StrutsのRequestUtils#populateが呼ばれています。

multipartの場合、この中で request.getInputStream() を用いInputStreamを
取得しています。S2Struts(commons-fileupload)はこのInputStream(実際には
CoyoteInputStreamというTomcatの実装)を用いてマルチパートデータの解析を
行っています。

初回(65行目からのパス)の解析は正常で、65行目に帰ってきた時点では
InputValueFormのインスタンスに正しくファイル内容がセットされています。

二回目(66行目からのパス)のInputStreamアクセス時点で readに失敗し、
Strutsの内部でMalformedうんぬん…が出てマルチパートの解析に失敗します。
結果、目的のフォームのDtoのセッタが呼ばれずnullのままとなってしまいます。

InputStreamの仕様によりそうですが、実装クラスは
CoyoteInputStream(Tomcatの実装)でした。この中までは追いかけていません。
基本的には request.getInputStream()が複数回コールされたときにリセット
されるのかどうかというspecに依存しそうですが、Tomcatではリセットはされ
ていないようです。

<アイデア>
いまのところありません。。。
一回だけしかmultipart解析させないようにするのが良いように思われますが、
いまのところいいアイデアがありません。

それともInputStreamを複数回呼べるようにうまくつつむ方法があるのか?? そ
れともInputValueFormに対する理解が間違っているのか..うーむ。。

なにかご助言いただけますと幸いです。

よろしくお願いします。

--
Hikaru Taniguchi <[E-MAIL ADDRESS DELETED]>



Seasar-user メーリングリストの案内