- PR -

ファイルのアップロードができません。

1
投稿者投稿内容
seijun1953
会議室デビュー日: 2007/03/15
投稿数: 15
お住まい・勤務地: 東京
投稿日時: 2007-03-15 23:50
Seijunと申します。初めまして。
Windows XP HOME,JDK1.5.0_10,Tomcat 5.5.20, commons-fileupload-1.0 or 2.0, commons-io-1.3、WTP1.5.3の環境下で、ファイルアップロードをしたいと思い、ネット情報を参考にして、次のようなサーブレットを書いてみました。
==========================================
package pack;

import java.io.*;
import java.util.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.servlet.*;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.disk.*;

/**
* Servlet implementation class for Servlet: UploadFileServlet
*
*/
public class UploadFileServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String path="C:/wtp153/workspace/Images";

DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);

factory.setSizeThreshold(1024);
factory.setRepository(new File("c:/temp"));
upload.setSizeMax(-1);
upload.setHeaderEncoding("Windows-31J");

try {
List list = upload.parseRequest(request);

Iterator iterator = list.iterator();

while(iterator.hasNext()) {
FileItem fitem = (FileItem)iterator.next();
String fileName = fitem.getName();
if ((fileName != null) && (!fileName.equals(""))) {
fileName = (new File(fileName)).getName();
fitem.write(new File(path + "/" + fileName));
}
}
} catch (FileUploadException e){
e.printStackTrace();
} catch (Exception e) {
//
}
response.sendRedirect("upFile.html");
}
}
==========================================
ところが、何故か
List list = upload.parseRequest(request);
のところで、例外が発生し、画像ファイル(JPG)がアップロードできません。
==========================================
致命的: サーブレット UploadFileServlet のServlet.service()が例外を投げました
java.lang.NoClassDefFoundError: javax/servlet/ServletInputStream
at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
at pack.UploadFileServlet.doPost(UploadFileServlet.java:34)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
==========================================
Javaは始めたばかりで、どうにも原因が分かりません。ネットではこのようなプログラムで、画像ファイル等のアップロードが出来ているようです。対処方法がおわかりの方がお出ででしたら、ご教示願えれば幸いです。

[ メッセージ編集済み 編集者: 未記入 編集日時 2007-03-15 23:51 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-03-16 00:08
たぶん実装の問題ではなく、クラスファイルの配置の問題です。
pack.UploadFileServlet が、jre/lib/ext とか、サーブレット関連の API が読み込まれるクラスローダよりも親のクラスローダで読み込まれているのではないでしょうか。

WEB-INF/lib または WEB-INF/classes に置きましょう。
seijun1953
会議室デビュー日: 2007/03/15
投稿数: 15
お住まい・勤務地: 東京
投稿日時: 2007-03-16 00:21
seijun1953です。有り難うございます。
引用:

インギさんの書き込み (2007-03-16 00:08) より:
たぶん実装の問題ではなく、クラスファイルの配置の問題です。
pack.UploadFileServlet が、jre/lib/ext とか、サーブレット関連の API が読み込まれるクラスローダよりも親のクラスローダで読み込まれているのではないでしょうか。

WEB-INF/lib または WEB-INF/classes に置きましょう。


Eclipse 3.2のWTP1.5.3を使っているので、クラスファイルは、
c:/wtp153/workplace/Upload/build/classesの下にあります。ブレークポイントを設定して、コードを追いかけると、
List list = upload.parseRequest(request);
のところで、catchのブロックに追いやられてしまいます。他のプロジェクトは、WTPの標準のプロジェクト作成方法で問題なく動いているのですが・・・。


[ メッセージ編集済み 編集者: seijun1953 編集日時 2007-03-16 00:23 ]
seijun1953
会議室デビュー日: 2007/03/15
投稿数: 15
お住まい・勤務地: 東京
投稿日時: 2007-03-16 09:27
インギさん、Seijun1953です。

Tomcatのcommon/libだけでなく、jdk1.5.0_10/jre/lib/extにもcommonsのライブラリを置いていましたが、後者に置いてあったcommonsのライブラリをsubという下位ディレクトリを作ってそちらに移動すると、画像のアップロードができるようになりました。

ヒントをどうも有り難うございました。それにしても、どうしてなのかなあ・・・。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-03-16 10:20
ここらへんが参考になるかと。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=28912&forum=12&3
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=15194&forum=12&start=8

なんとなくクラスパスに通ってくれて便利かもしれませんが、基本的に jre/lib/ext にライブラリを配置すべきではありません。
seijun1953
会議室デビュー日: 2007/03/15
投稿数: 15
お住まい・勤務地: 東京
投稿日時: 2007-03-16 21:31
seijun1953です。
引用:

インギさんの書き込み (2007-03-16 10:20) より:
ここらへんが参考になるかと。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=28912&forum=12&3
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=15194&forum=12&start=8

なんとなくクラスパスに通ってくれて便利かもしれませんが、基本的に jre/lib/ext にライブラリを配置すべきではありません。


どうも有り難うございました。
1

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