- 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 )