- PR -

commonsのFileUploadを使ったファイルのアップロードについて

1
投稿者投稿内容
もの
会議室デビュー日: 2005/11/09
投稿数: 8
投稿日時: 2006-02-09 21:10
お世話になります。

http://www.atmarkit.co.jp/fjava/javatips/106jakarta018.html

を参考にさせていただきながら、ファイルアップロード処理を試しています。

利用ライブラリ:
commons-fileupload-1.1.jar
commons-beanutils.jar(これは不要?)

1.まず、上のサイトのコードをそのまま使ってみると、
コード:

説明 The server encountered an internal error () that prevented it from fulfilling this request.

例外

javax.servlet.ServletException: サーブレットの実行により例外を投げました


原因

java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream
org.apache.commons.fileupload.DefaultFileItemFactory.createItem(DefaultFileItemFactory.java:102)
org.apache.commons.fileupload.FileUploadBase.createItem(FileUploadBase.java:500)
org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:367)
org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:268)
UploadServlet.doPost(UploadServlet.java:26)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


注意 原因のすべてのスタックトレースは、Apache Tomcat/5.5.9のログに記録されています


というエラーになります。

Eclipse上でこのコードを表示している際、
「型DiskFileUploadは使用すべきではありません」と表示されますが、
これと関係あるのでしょうか。

2.次に、commonsのサイトをちらっと見るとサンプルが出ていたので、
コード:

// Create a new file upload handler
FileUpload upload = new FileUpload();

// Set upload parameters
upload.setSizeMax(MAX_UPLOAD_SIZE);
upload.setSizeThreshold(MAX_MEMORY_SIZE);
upload.setRepositoryPath(TEMP_DIR);

// Parse the request
List items = upload.parseRequest(request);

// Process the uploaded fields
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();

if (item.isFormField()) {
processTextParameter(request, item);
} else {
processFileParameter(request, item);
}
}


DiskFileUploadクラスを使わずにFileUploadを使ってみたのですが、
今度はエラーは出ないものの、ファイル自体が所定のフォルダに
アップされていませんでした。

お知恵をお貸しください。宜しくお願いいたします。

[ メッセージ編集済み 編集者: もの 編集日時 2006-02-09 21:12 ]
ハツキタツミ
大ベテラン
会議室デビュー日: 2005/05/24
投稿数: 108
投稿日時: 2006-02-10 10:25
引用:
java.lang.NoClassDefFoundError:org/apache/commons/io/output/DeferredFileOutputStream



エラーメッセージの意味そのまま。

引用:
「型DiskFileUploadは使用すべきではありません」と表示されますが、
これと関係あるのでしょうか。



DiskFileUploadはDepricatedされているから。javadoc読め。

引用:
DiskFileUploadクラスを使わずにFileUploadを使ってみたのですが、
今度はエラーは出ないものの、ファイル自体が所定のフォルダに
アップされていませんでした。



書き出していないから当然かと。
もの
会議室デビュー日: 2005/11/09
投稿数: 8
投稿日時: 2006-02-13 15:08
ハツキタツミさん、ご丁寧なご指導ありがとうございました。

まず、

引用:

ハツキタツミさんの書き込み (2006-02-10 10:25) より:
引用:
java.lang.NoClassDefFoundError:org/apache/commons/io/output/DeferredFileOutputStream



エラーメッセージの意味そのまま。




確かにそのままでした。
エラーの意味を調べることの大切さを知りました。

commonsのサイトから下記のファイルを落とし、
%TOMCAT_HOME%\common\libにコピーしたら解決できました。

commons-io-1.1.jar

引用:

引用:
「型DiskFileUploadは使用すべきではありません」と表示されますが、
これと関係あるのでしょうか。



DiskFileUploadはDepricatedされているから。javadoc読め。




JavaDocを読みますと、
Deprecated. Use ServletFileUpload together with DiskFileItemFactory instead.
と書かれておりましたので、代わりに下記のようなコードにしてみました。

的外れな部分があるかと思いますが、一応アップロードに成功しました。
本当にありがとうございました。

コード:

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;

public class UploadServlet extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//String path = getServletContext().getRealPath("WEB-INF/data");
//File path = new File( getServletContext().getRealPath("WEB-INF/data") );
File path = new File("d://test/");

//DiskFileUpload objDfu = new DiskFileUpload();

DiskFileItemFactory dfi = new DiskFileItemFactory();
dfi.setRepository(path); // 一時ファイルの保存先フォルダ
dfi.setSizeThreshold(1024); // バッファサイズ

ServletFileUpload sfu = new ServletFileUpload(dfi);

sfu.setSizeMax(-1); // アップロードファイルの最大サイズ(-1は無限)
sfu.setHeaderEncoding("Windows-31J"); // ヘッダの文字エンコーディング

try {

// アップロードされたファイル情報をFileItemオブジェクトのリストとして取得

List objLst= sfu.parseRequest(request);
Iterator objItr=objLst.iterator();

// リストから順にファイルデータを取り出し、「/WEB-INF/data/元のファイル名」の形式でアップロードファイルを保存
while(objItr.hasNext()){

FileItem objFi=(FileItem)objItr.next();

if(!objFi.isFormField()){
// アップロードファイルの元ファイル名を取得

String strNam=objFi.getName();
if(strNam!=null && !strNam.equals("")){
strNam=(new File(strNam)).getName();
objFi.write(new File(path + "/" + strNam));
}
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
// 処理後は元のupload.jspにリダイレクト
response.sendRedirect("upload.jsp");
}
}

[ メッセージ編集済み 編集者: もの 編集日時 2006-02-13 15:09 ]



[ メッセージ編集済み 編集者: もの 編集日時 2006-02-13 15:13 ]
1

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