- PR -

struts1.1のfileuploadのOutOfMemoryErrorについて

1
投稿者投稿内容
ネット初心者
会議室デビュー日: 2005/04/08
投稿数: 13
投稿日時: 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>
masa
大ベテラン
会議室デビュー日: 2005/05/11
投稿数: 108
投稿日時: 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/03/25
投稿数: 26
投稿日時: 2005-07-08 12:38
struts1.1からfileuploadを間接的に利用する例と、fileuploadを直接利用する例が挙げられていますが、両者とも同じ環境で試されたでしょうか?

アプリケーションサーバ(やJVM)が利用できるリソース(メモリ)の量を増やせば、何とかなったりしないでしょうか?

----
話は異なりますが、fileuploadの限界サイズを儲けないと、いくら今回の事象が解決しても、もっと大きなファイルを実行環境でuploadされたら困るような気がします。
(Discサイズも圧迫しますし。。。)
ネット初心者
会議室デビュー日: 2005/04/08
投稿数: 13
投稿日時: 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

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