- - PR -
struts1.1のfileuploadのOutOfMemoryErrorについて
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-07-07 19:07
いつも参考にさせていただいております。
ファイルのupload処理を行うプログラムをstrutsで作っておりますが 50Mを超えるファイルをuploadするとOutOfMemoryErrorのエラーとなってしまいます。 同様の処理をcommons-fileupload.jarを使ってservletで作りましたが200Mを超えた ファイルはuploadできました。 ただし、上記struts上でupload処理のみcommons-fileupload.jarを使ったservlet 処理に置き換えても同様のエラーとなってしまいます。 FormFileのデータはgetInputStream()を使って下記のとおり作っておりますが(複数指定しますがそのうちの1つの指定ファイルが50MでOutOfMemoryErrorとなります) やはりstrutsの問題でしょうか。strutsのjarファイルは1.1の最新をダウンロードして使っています。どうかご教授お願いします。 UploadForm dForm=(UploadForm)fm; FormFile fForm=(FormFile)dForm.getFile("複数ファイルのうちのカウント"); InputStream is = fForm.getInputStream(); //入力ストリームをバッファリング //BufferedInputStream inBuffer = new BufferedInputStream(is); //ファイルのアップロード先を指定して、出力ストリームを生成 OutputStream fos = new FileOutputStream ("出力パス"); int readBytes = 0; byte[] buffer = new byte[8192]; //ファイル書き込み while ((readBytes = is.read(buffer, 0, 8192)) != -1) { fos.write(buffer, 0, readBytes); } fForm.destroy(); is.close(); fos.close(); //以下がフォームです。(5つのファイルをuploadします。) import org.apache.struts.action.*; import org.apache.struts.upload.FormFile; / public final class UploadForm extends ActionForm { private FormFile[] file = new FormFile[5]; public UploadForm() { } public FormFile getFile(int index) {return this.file[index];} public void setFile(int index,FormFile file) { this.file[index]=file;} public FormFile[] getFiles() {return this.file;} } //struts-config.xmlは以下のとおりです。 <action path="/Upload" type="fileTrans.FileUploadServlet" scope="request" name="UploadForm" input="/Upload.do"> </action> |
|
投稿日時: 2005-07-08 11:04
こんにちは。
かなり昔に解決されたバグとして以下がありますが、1.1の 最新をご使用とのことでしたらあてはまらないですね。 http://issues.apache.org/bugzilla/show_bug.cgi?id=5274 commons-fileuploadを生で使用する場合と、StrutsのFormFile から間接的に使用する場合でメモリ使用量に影響を与えそうな 点を調査してみたところ、 sizeThresholdのデフォルト値が struts:256KB commons-fileupload生:10KB となっていました。 状況が変化するかどうかはなんとも言えませんが、 Servlet内でsetSizeThreshold(256 * 1024) を指定し、upload ファイルサイズの上限に変化がないかを確認してみてはいかが でしょうか。 |
|
投稿日時: 2005-07-08 12:38
struts1.1からfileuploadを間接的に利用する例と、fileuploadを直接利用する例が挙げられていますが、両者とも同じ環境で試されたでしょうか?
アプリケーションサーバ(やJVM)が利用できるリソース(メモリ)の量を増やせば、何とかなったりしないでしょうか? ---- 話は異なりますが、fileuploadの限界サイズを儲けないと、いくら今回の事象が解決しても、もっと大きなファイルを実行環境でuploadされたら困るような気がします。 (Discサイズも圧迫しますし。。。) |
|
投稿日時: 2005-07-08 13:08
返信ありがとうございます。
環境はstruts,servletとも下記環境でwebapps配下のプロジェクトを別にして実行しています。そのため、jvmやアプリケーションサーバの問題ではなく、strutsの問題かとおもったのですが、他に設定箇所があるのでしょうか。アップロードのファイルのサイズの上限設定についてはstruts-config.xmlのcontrollerタグで設定しようと思っています。 webサーバー:Apache HTTP サーバ2.0.54 アプリケーションサーバー:tomcat4.0.6 jvm:1.4.2_08 |
1