- PR -

Apache+Tomcatでファイルアップロードの際に起こる事象が解決できません

投稿者投稿内容
yuu
大ベテラン
会議室デビュー日: 2002/06/12
投稿数: 152
お住まい・勤務地: 美味しいケーキ店のそば
投稿日時: 2004-07-27 14:20
ひろひろ さん、
はじめまして。 私も以前 作ったシステムで同じような現象になりました。
構成は同じようなかんじですが Struts 1.1 を使っていました。
やはり、Tomcat のみで開発し テスト時に apache と連携させてテストしたところ inputタグで入力された値が 受け取れなかったり、受け取れたりと不安定でした。

その時はStruts や FileUploadのソースを少し追いかけたのですが納入まで時間が無かったので原因が突き止められず、 upload ボタンだけ別の form にし逃げました
(仕様的には問題なかったので・・・)
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-07-27 15:51
引用:

ひろひろさんの書き込み (2004-07-26 23:00) より:
いつもお世話になっております。
A 横取り丸+InetSpyでHttpのログを確認したところ、サイズが大きい為かリクエストが二つに分かれてしまう。


この現象は、ブラウザとApacheの間で起きていることですか? リクエストが二つに分かれて
いる、ということからチャンクエンコーディングされているのかな、という気がしますが
それらしいヘッダはついていますか?
ひろひろ
常連さん
会議室デビュー日: 2004/07/23
投稿数: 36
投稿日時: 2004-07-27 16:15
yuuさん、ukさんレスありがとうございます。
引用:

その時はStruts や FileUploadのソースを少し追いかけたのですが納入まで時間が無かったので原因が突き止められず、 upload ボタンだけ別の form にし逃げました


こちらの仕様では逃げれません。
このアップロードの処理の後、画面遷移が待っているからです。
せっかく教えていただいたのに申し訳ありません。

引用:

この現象は、ブラウザとApacheの間で起きていることですか? リクエストが二つに分かれて
いる、ということからチャンクエンコーディングされているのかな、という気がしますが
それらしいヘッダはついていますか?


ブラウザとApacheの間でこの現象が起こっています。
と、いうより、これは私の勘違いだった可能性が高いです。
正確には
Request(一回目)→アップロード処理→失敗!(Exception)→Request(二回目)
という経緯のようです。(二回目のRequestはヘッダも無くただのバイナリの塊のように見えます)
つまり一回の操作で二つのRequestが投げられたようではないようです。
誤った情報を出してしまい申し訳ありません。

現在も調査を進めていますが、どうやらFileUploadのモジュールの中で無限ループを
起こし、IllegalArgumentExceptionが発生しているようです。
しかし、何故無限ループが起こるかはいまだに不明です。

[ メッセージ編集済み 編集者: ひろひろ 編集日時 2004-07-27 16:18 ]
ひろひろ
常連さん
会議室デビュー日: 2004/07/23
投稿数: 36
投稿日時: 2004-07-29 10:24
本件解決しました。
しかし、なぜ解決したかわからない状況です。

まず、調査を進めていたところ以下のstackが出ていましたのでmod_jkのエンコードが
問題であると推測しました。

java.lang.IllegalArgumentException
at java.nio.Buffer.position(Buffer.java:218)
at java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:575)
at java.lang.StringCoding$CharsetSD.decode(StringCoding.java:186)
at java.lang.StringCoding.decode(StringCoding.java:224)
at java.lang.StringCoding.decode(StringCoding.java:230)
at java.lang.String.<init>(String.java:371)
at org.apache.jk.common.JkInputStream.receive(JkInputStream.java:326)
at org.apache.jk.common.JkInputStream.refillReadBuffer(JkInputStream.java:362)
at org.apache.jk.common.JkInputStream.doRead(JkInputStream.java:272)
at org.apache.jk.server.JkCoyoteHandler.doRead(JkCoyoteHandler.java:294)
at org.apache.coyote.Request.doRead(Request.java:469)
at org.apache.coyote.tomcat4.CoyoteInputStream.readBytes(CoyoteInputStream.java:197)
at org.apache.coyote.tomcat4.CoyoteInputStream.read(CoyoteInputStream.java:154)
at org.apache.commons.fileupload.MultipartStream.readBodyData(MultipartStream.java:575)
(以下略)

で、mod_jkのエンコード周りで色々調べていたのですがまったく解決せず、mod_jkの
ソースをコンパイルしなおしてオリジナルmod_jkを作るしかないのかな、と思っていました。

とはいえ、あまりこういうことはやりたくなかったので、途方にくれていました。

原因解決できない状況で、何もやることがなくなってしまい、
ちょっと環境を整えようと思い、common/lib/log4j-1.2.8.jarがここにあるのが
まずいのを知っていたので削除したところ、今まで思い悩んでいたApache+Tomcatでのファイルのアップロードがうまくいきました。
(プロジェクトメンバーの誰かが誤ってここにlog4jをコピーしてしまったようです。)

どうやらApache+Tomcatでファイルアップロードができないのは%CATALINA_HOME%/common/libの下にlog4j-1.2.8.jarが入っていた為のようです。

しかし、なぜlog4jがエンコードに絡んでいるのかが理解できません。

どなたかご存知の方いらっしゃいますでしょうか?



[ メッセージ編集済み 編集者: ひろひろ 編集日時 2004-07-29 10:46 ]

スキルアップ/キャリアアップ(JOB@IT)