- Home ›
- サーブレット入門 ›
- Jakarta Commons FileUploadの利用手順 ›
- HERE
送られてきたデータの処理
ではクライアントから送られてきたデータを処理していきます。ServletFileUploadクラスを使います。(以前はDiskFileUploadクラスを使っていましたが、現在は非推奨となっています)。
クラス図は下記のようになっています。
- java.lang.Object
- org.apache.commons.fileupload.FileUploadBase
- org.apache.commons.fileupload.FileUpload
- org.apache.commons.fileupload.servlet.ServletFileUpload
- public class ServletFileUpload extends FileUpload
コンストラクタは2つありますが、下記のコンストラクタを使うようにします。
ServletFileUpload public ServletFileUpload(FileItemFactory fileItemFactory)
Constructs an instance of this class which uses the supplied factory to create FileItem instances.
FileItemFactoryはインターフェースです。実際にはインターフェースを実装したDiskFileItemFactoryクラスを使うのですが、DiskFileItemFactoryクラスは後で見ていきますので、取りあえず気にしないで下さい。
実際の使い方は下記のようになります。
DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload sfu = new ServletFileUpload(factory);
パーツの分割
ServletFileUploadクラスは multipart/mixed エンコーディングタイプによってクライアントから送られてきた複数のデータを、それぞれFileItemクラスのオブジェクトとして分割して取得することができます。
分割するためにはServletFileUploadクラスで用意されている"parseRequest"メソッドを使います。
parseRequest
public java.util.List parseRequest(javax.servlet.http.HttpServletRequest r)
throws FileUploadException
Processes an RFC 1867 compliant multipart/form-data stream.
Parameters:
r - The servlet request to be parsed.
Returns:
A list of FileItem instances parsed from the request, in the order
that they were transmitted.
Throws:
FileUploadException - if there are problems reading/parsing the
request or storing files.
引数にはサーブレットの"doPost"メソッドの引数として渡されてきたHttpServletRequestクラスの値を指定します。
各パーツはFileItemクラスのオブジェクトに分割されます。そして全てのFileItemクラスのオブジェクトが格納されたコレクションが"parseRequest"メソッドの戻り値として取得することが出来ます。
あとはコレクションから1つ1つFileItemクラスのオブジェクトを取り出せば、送られてきた各パーツを取得する事が出来ます。(FileItemクラスについては別のページで詳しく見ていきます)。
実際の使い方は下記のようになります。
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload sfu = new ServletFileUpload(factory);
try {
List list = sfu.parseRequest(request);
Iterator iterator = list.iterator();
while(iterator.hasNext()){
FileItem item = (FileItem)iterator.next();;
/* 取り出したFileItemに対する処理 */
}
}catch (FileUploadException e) {
e.printStackTrace();
}
}
アップロードテスト
では実際に試してみましょう。
下記を「UploadTest.java」として保存して下さい。下記はアップロードされたファイルのファイル名を表示するだけのサンプルです。
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.servlet.*;
import org.apache.commons.fileupload.disk.*;
import java.util.List;
import java.util.Iterator;
public class UploadTest extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
response.setContentType("text/html; charset=Shift_JIS");
PrintWriter out = response.getWriter();
request.setCharacterEncoding("Shift-JIS");
out.println("<html>");
out.println("<head>");
out.println("<meta http-equiv=¥"Content-Type¥" content=¥"text/html;charset=Shift_JIS¥">");
out.println("<title>Upload Test!</title>");
out.println("</head>");
out.println("<body>");
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload sfu = new ServletFileUpload(factory);
try {
List list = sfu.parseRequest(request);
Iterator iterator = list.iterator();
while(iterator.hasNext()){
FileItem item = (FileItem)iterator.next();
out.println("<p>");
out.println(item.getName());
out.println("</p>");
}
}catch (FileUploadException e) {
e.printStackTrace();
}
out.println("</body>");
out.println("</html>");
}
}
次にコンパイルを行います。必要なJARファイルにクラスパスを通してコンパイルを行います。
javac -classpath "D:¥tomcat¥Tomcat 5.5¥common¥lib¥servlet-api.jar";D:¥commons¥commons-fileupload-1.1.1¥commons-fileupload-1.1.1.jar UploadTest.java
コンパイルが終わりましたら作成されたクラスファイルを「d:¥servlet-sample¥upload¥WEB-INF¥classes¥」ディレクトリに配置します。(必要に応じてTomcatを再起動して下さい)。
ではブラウザから「http://localhost:8080/upload/uploadtest.html」と呼び出して下さい。
「参照」ボタンを押してアップロードするファイルを選択します。
今回は「d:¥servlet-sample¥tmp」内にある「test.txt」ファイルを選択しました。では「アップロード」ボタンをクリックします。
上記のようにアップロードされたファイルのファイル名が表示されれば成功です。
( Written by Tatsuo Ikura )
JavaDrive