- - PR -
Apache+Tomcatでファイルアップロードの際に起こる事象が解決できません
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-07-27 14:20
ひろひろ さん、
はじめまして。 私も以前 作ったシステムで同じような現象になりました。 構成は同じようなかんじですが Struts 1.1 を使っていました。 やはり、Tomcat のみで開発し テスト時に apache と連携させてテストしたところ inputタグで入力された値が 受け取れなかったり、受け取れたりと不安定でした。 その時はStruts や FileUploadのソースを少し追いかけたのですが納入まで時間が無かったので原因が突き止められず、 upload ボタンだけ別の form にし逃げました (仕様的には問題なかったので・・・) | ||||||||
|
投稿日時: 2004-07-27 15:51
この現象は、ブラウザとApacheの間で起きていることですか? リクエストが二つに分かれて いる、ということからチャンクエンコーディングされているのかな、という気がしますが それらしいヘッダはついていますか? | ||||||||
|
投稿日時: 2004-07-27 16:15
yuuさん、ukさんレスありがとうございます。
こちらの仕様では逃げれません。 このアップロードの処理の後、画面遷移が待っているからです。 せっかく教えていただいたのに申し訳ありません。
ブラウザとApacheの間でこの現象が起こっています。 と、いうより、これは私の勘違いだった可能性が高いです。 正確には Request(一回目)→アップロード処理→失敗!(Exception)→Request(二回目) という経緯のようです。(二回目のRequestはヘッダも無くただのバイナリの塊のように見えます) つまり一回の操作で二つのRequestが投げられたようではないようです。 誤った情報を出してしまい申し訳ありません。 現在も調査を進めていますが、どうやらFileUploadのモジュールの中で無限ループを 起こし、IllegalArgumentExceptionが発生しているようです。 しかし、何故無限ループが起こるかはいまだに不明です。 [ メッセージ編集済み 編集者: ひろひろ 編集日時 2004-07-27 16:18 ] | ||||||||
|
投稿日時: 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 ] | ||||||||
