送られてきたデータの処理

広告

ではクライアントから送られてきたデータを処理していきます。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つありますが、下記のコンストラクタを使うようにします。

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"メソッドを使います。

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」と呼び出して下さい。

HTMLファイルの表示

「参照」ボタンを押してアップロードするファイルを選択します。

アップロードファイルの選択

今回は「d:\servlet-sample\tmp」内にある「test.txt」ファイルを選択しました。では「アップロード」ボタンをクリックします。

アップロードファイルの名前の表示

上記のようにアップロードされたファイルのファイル名が表示されれば成功です。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。