- PR -

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

投稿者投稿内容
ひろひろ
常連さん
会議室デビュー日: 2004/07/23
投稿数: 36
投稿日時: 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を制限しているような箇所があるのでしょうか?
もしくは見当違いのことをしているのでしょうか?

ご教授お願いします。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2004-07-27 05:49
普通はファイルップロード時にはMIME MULTIPARTで送られてくるのを想定してそれらを結合して元に戻してやる処理が必要だと思います。
ひろひろ
常連さん
会議室デビュー日: 2004/07/23
投稿数: 36
投稿日時: 2004-07-27 08:43
レスありがとうございます。
引用:

普通はファイルップロード時にはMIME MULTIPARTで送られてくるのを想定してそれらを結合して元に戻してやる処理が必要だと思います。


アップロードの処理にはjakartaのファイルアップロードを使用しています。
http://www.h7.dion.ne.jp/~s_wat/jakarta/fileupload.html
こちらのサンプルコードを参考にして作成しています。これでは結合できないのでしょうか?

ところで、デバッグしていて気付いたのですが、サーブレットへ渡された何も処理を施していないrequestに対してgetParameterを試してみましたがやはり結果は同じくnullが返ってきました。
何か参考になるでしょうか?

あと、requestが分割してしまうということは良くあることなのでしょうか?
おがわ
大ベテラン
会議室デビュー日: 2001/08/01
投稿数: 199
お住まい・勤務地: 千葉県
投稿日時: 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
swat
常連さん
会議室デビュー日: 2002/03/21
投稿数: 33
お住まい・勤務地: 埼玉県
投稿日時: 2004-07-27 10:34
swat@サンプルコードの中の人です。

FileUploadを使う場合、リクエストパラメータの取り出しは、すべてFileUploadを通じて行なうことになります。
サンプルコードの中で、

コード:

//通常のフォームからのデータなら
if(aItem.isFormField()){
  //フォームデータの処理


している部分がありますが、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/23
投稿数: 36
投稿日時: 2004-07-27 11:56
SuperCreekさん、swatさん。レスありがとうございます。

お二人のわかりやすい回答のおかげで理解できました。
少しコードをいじって試してみます。

>swatさん。
勝手にサンプルソースを公開してしまって申し訳ありません。
わかりやすい説明だったのでつい勝手に公開してしまいました。

[ メッセージ編集済み 編集者: ひろひろ 編集日時 2004-07-27 12:19 ]
swat
常連さん
会議室デビュー日: 2002/03/21
投稿数: 33
お住まい・勤務地: 埼玉県
投稿日時: 2004-07-27 12:39
swatです。
引用:

>swatさん。
勝手にサンプルソースを公開してしまって申し訳ありません。
わかりやすい説明だったのでつい勝手に公開してしまいました。


いえいえ。こちらこそお役に立ててよかったです。
_________________
****** swat ******
http://www.h7.dion.ne.jp/~s_wat/
http://d.hatena.ne.jp/swat/
ひろひろ
常連さん
会議室デビュー日: 2004/07/23
投稿数: 36
投稿日時: 2004-07-27 13:38
私が直面している問題の原因が大分はっきりしてきました。

そもそも、swatさんのサンプルを元に私のソースを作成させてもらっているのですが
エラー処理を画面に表示するように実装できていなかったのが先ほど発見されました。
そこを改修し、さらにSuperCreekさんのいうようにmultipart/form-data形式をサポートする
ようなHttpServletRequestのラッパクラスを作成し、サイズの小さなファイルは正常に
アップロード関連の処理(MyRequest$getParameterも含む)が終了できたことを
確認しました。
しかし、サイズの大きなファイルになるとswatさんのサンプルコードでいう
引用:


//リクエストをパース
List list = upload.parseRequest(request);


の部分でjava.lang.IllegalArgumentExceptionが発生しています。
先ほどまではこのExceptionの処理をきちんとしていなかったためこれの発見に至りませんでした。

で、本題なのですが、最初にも書いているとおりTomcatの簡易HTTPサーバー単体では上手くいきます。(10MBだろうが20MBだろうがアップロードできます。)
しかし、Apacheをかませるととたんに上手くいかないということはやはり、mod_jkかApacheに
問題があると考えた方がよいのでしょうか?
ちなみに、httpd.confの LimitRequestBody ディレクティブに1000に指定したところ
413エラーが発生しましたのでLimitRequestBody は1024000000としてあります。


[ メッセージ編集済み 編集者: ひろひろ 編集日時 2004-07-27 13:42 ]

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