- - PR -
Apache+Tomcatでファイルアップロードの際に起こる事象が解決できません
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2004-07-26 23:00
いつもお世話になっております。
先日、投稿させていただいたばかりですが、再度投稿させていただきたいと思います。 以下のサーバー環境でクライアントからのHTTPでのアップロードの処理をさせようとしています。 Apache 1.3.31 mod_jk 1.2 Tomcat 4.1.30 OS RedHat AS2.1 jdk1.4.2 クライアントはIE6.0SP1です Tomcatの簡易Httpサーバーを使用してHttpアップロードを行った際は何の問題も 起こらず正常にアップロードの処理ができました。(80MBのファイルもアップロードが出来ました) しかし、Apacheと連携させ、さらにおよそ1MBを越えるファイルをアップロードしようとすると以下のような 現象が起きてしまいます。 @ JSPにてFORMのhiddenで指定したパラメータを取得しようと思い Request$getParameter をしたがnullが返ってくる(正常な場合はJSPにて指定したFORMの値が返ってくる) A 横取り丸+InetSpyでHttpのログを確認したところ、サイズが大きい為かリクエストが二つに分かれてしまう。 Tomcat単体では何の問題もなくアップロードができるということはApacheかもしくはmod_jkが悪さをしているのだと私は推測しました。 そこで、以下の対策を実施してみました。 @ httpd.confの LimitRequestBody ディレクティブに1024000000と指定 A 同じくhttpd.confの MaxKeepAliveRequests ディレクティブを0に指定 しかし、効果はありませんでした。(mod_jkはどこを設定するのかわかりませんでした。) どこか他にRequestを制限しているような箇所があるのでしょうか? もしくは見当違いのことをしているのでしょうか? ご教授お願いします。 | ||||
|
投稿日時: 2004-07-27 05:49
普通はファイルップロード時にはMIME MULTIPARTで送られてくるのを想定してそれらを結合して元に戻してやる処理が必要だと思います。
| ||||
|
投稿日時: 2004-07-27 08:43
レスありがとうございます。
アップロードの処理にはjakartaのファイルアップロードを使用しています。 http://www.h7.dion.ne.jp/~s_wat/jakarta/fileupload.html こちらのサンプルコードを参考にして作成しています。これでは結合できないのでしょうか? ところで、デバッグしていて気付いたのですが、サーブレットへ渡された何も処理を施していないrequestに対してgetParameterを試してみましたがやはり結果は同じくnullが返ってきました。 何か参考になるでしょうか? あと、requestが分割してしまうということは良くあることなのでしょうか? | ||||
|
投稿日時: 2004-07-27 10:07
javax.servlet.http.HttpServletRequestはmultipart/form-data形式の要求を標準サポートしていません。
そのため,HttpServletRequest#getParameter(String)を呼んでも,null or ""(空文字)が戻ってくるでしょう。 返される値はコンテナによって異なるかもしれませんが,期待したパラメータ値は基本的に返ってきません。 どうしても,HttpServletRequest#getParameter(String)を使って,パラメータ値を取得したいのであれば,javax.servlet.http.HttpServletRequestWrapper等のAPIを用いて,multipart/form-data形式をサポートするHttpServletRequestのラッパクラスを作成してください。 _________________ Kan Ogawa k-ogawa@users.sourceforge.jp | ||||
|
投稿日時: 2004-07-27 10:34
swat@サンプルコードの中の人です。
FileUploadを使う場合、リクエストパラメータの取り出しは、すべてFileUploadを通じて行なうことになります。 サンプルコードの中で、
している部分がありますが、hiddenのような通常のフォームパラメータは、FileItem#isFormField()がtrueになりますので、ここで、FileItem#getString()としてやればhiddenの内容が取得できるはずです。 お役に立てば幸いです。 _________________ ****** swat ****** http://www.h7.dion.ne.jp/~s_wat/ http://d.hatena.ne.jp/swat/ [ メッセージ編集済み 編集者: swat 編集日時 2004-07-27 10:38 ] | ||||
|
投稿日時: 2004-07-27 11:56
SuperCreekさん、swatさん。レスありがとうございます。
お二人のわかりやすい回答のおかげで理解できました。 少しコードをいじって試してみます。 >swatさん。 勝手にサンプルソースを公開してしまって申し訳ありません。 わかりやすい説明だったのでつい勝手に公開してしまいました。 [ メッセージ編集済み 編集者: ひろひろ 編集日時 2004-07-27 12:19 ] | ||||
|
投稿日時: 2004-07-27 12:39
swatです。
いえいえ。こちらこそお役に立ててよかったです。 _________________ ****** swat ****** http://www.h7.dion.ne.jp/~s_wat/ http://d.hatena.ne.jp/swat/ | ||||
|
投稿日時: 2004-07-27 13:38
私が直面している問題の原因が大分はっきりしてきました。
そもそも、swatさんのサンプルを元に私のソースを作成させてもらっているのですが エラー処理を画面に表示するように実装できていなかったのが先ほど発見されました。 そこを改修し、さらにSuperCreekさんのいうようにmultipart/form-data形式をサポートする ようなHttpServletRequestのラッパクラスを作成し、サイズの小さなファイルは正常に アップロード関連の処理(MyRequest$getParameterも含む)が終了できたことを 確認しました。 しかし、サイズの大きなファイルになるとswatさんのサンプルコードでいう
の部分でjava.lang.IllegalArgumentExceptionが発生しています。 先ほどまではこのExceptionの処理をきちんとしていなかったためこれの発見に至りませんでした。 で、本題なのですが、最初にも書いているとおりTomcatの簡易HTTPサーバー単体では上手くいきます。(10MBだろうが20MBだろうがアップロードできます。) しかし、Apacheをかませるととたんに上手くいかないということはやはり、mod_jkかApacheに 問題があると考えた方がよいのでしょうか? ちなみに、httpd.confの LimitRequestBody ディレクティブに1000に指定したところ 413エラーが発生しましたのでLimitRequestBody は1024000000としてあります。 [ メッセージ編集済み 編集者: ひろひろ 編集日時 2004-07-27 13:42 ] | ||||
