Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 > Servlet・JSP > Servlet −12.ファイルアップロード
更新日:2006/10/29
Servlet−12.ファイルアップロード
Servletでファイルアップロードを行うプログラムを作成します。Jakarta Commonsではファイルアップロードを行うプログラムを簡易に作成するライブラリFileUploadを提供しています。ここではそのFileUploadを使用して、ファイルアップロードを行うプログラムを作成します。

実行環境
・WindowsXP Home Edition
・JDK 1.5.0_04
・Tomcat 5.5.9
・commons-fileupload-1.1.1
・commons-io-1.2
FileUploadのインストール
FileUploadのインストール方法について解説します。インストールは簡単です。JakartaProjectのサイトからFileUploadライブラリをダウンロードし、jarファイルを該当するディレクトリに設置するだけです。
(1). Jakarta CommonsのダウンロードページからFileUploadライブラリを選択します。
Javaの道_FileUpload_1
(2). FileUploadライブラリのダウンロードページで、Binaryで最新バージョンのzipファイルをダウンロードします。
Javaの道_FileUpload_2
(3). ダウンロードしたzipファイルを解凍し、その中のcommons-fileupload-1.1.1.jarファイルを該当ディレクトリに設置します。Tomcatを利用している場合は、通常は$CATALINA_HOME\common\libディレクトリ配下に設置します。これでインストールの終了です。
IOのインストール
FileUploadを利用するためには、Jakarta CommonsのIOライブラリも必要です。IOのインストール方法について、解説します。
(1). Jakarta CommonsのダウンロードページからIOライブラリを選択します。
Javaの道_FileUpload_3
(2). IOライブラリのダウンロードページで、Binaryで最新バージョンのzipファイルをダウンロードします。
Javaの道_FileUpload_4
(3). ダウンロードしたzipファイルを解凍し、その中のcommons-io-1.2.jarファイルを該当ディレクトリに設置します。Tomcatを利用している場合は、通常は$CATALINA_HOME\common\libディレクトリ配下に設置します。これでインストールの終了です。
FileUploadの主要クラス、主要メソッド
FileUploadで用意されている主要クラス、主要メソッドについて解説します。 FileUploadでは、ファイルデータをFileItemオブジェクトで管理します。
※その他のクラス、メソッドについては、APIリファレンスを参照してください。
DiskFileItemFactoryクラス
FileItemオブジェクトを生成するクラスです。メモリ、HDDでのデータ処理に関するメソッドが用意されています。
戻り型
メソッド
説明
void setSizeThreshold(int) メモリにバッファする最大値をbytesで指定します。容量の大きなデータをアップロードする際は、最大値を超えた場合、バッファ内のデータは一時領域に保存されます。
void setRepository(File) setSizeThresholdメソッドで指定したバッファ最大値を超えた場合、バッファ内のデータを保存する一時領域を指定します。
ServletFileUploadクラス
Servletプログラムを経由して、ファイルデータを取得するクラスです。ファイルデータはFileItemオブジェクトが格納されたListコレクションとして、返されます。
戻り型
メソッド
説明
List parseRequest(HttpServletRequest) RFC 1867に準拠した形式で送られてきたデータをFileItemオブジェクトに分割し、Listコレクションとして返します。送られてくるデータはHttpServletRequestオブジェクトから取得できます。
void setSizeMax アップロードできるデータ容量の最大値をbytesで指定します。無制限の場合は-1を指定します。
void setHeaderEncoding(String) データを受信する際のエンコード方式を指定します。ファイル名に日本語を使用している場合は、特に指定したほうがいいです。指定しない場合は、使用しているプラットフォームのデフォルトのエンコード方式が使用されます。
FileItemインタフェース
FileItemオブジェクトに関するメソッドが用意されています。
戻り型
メソッド
説明
String getName( ) アップロードされたファイルのファイル名を返します。ファイル名はPATH名も含みます。
boolean isFormField( ) FileItemオブジェクトに格納されている値がファイルデータか、その他のFORMデータかを判別します。その他のFORMデータの場合はtrueを返し、ファイルデータの場合はfalseを返します。
void write(File) アップロードされたデータを引数に指定されたファイルに書き出します。
使用例
FileUploadライブラリを使用し、ファイルのアップロードを行うプログラムを作成します。HTMLのFORM画面で、アップロードを行いたいファイルを選択し、アップロードを行うプログラムです。
HTMLファイルの作成
アップロードするファイルを選択するHTMLファイルです。<FORM>タグのenctype属性に"multipart/form-data"を指定する必要があります。
【upFile.html】
<html>
<head>
<title>FileUpload</title>
<meta http-equiv="Content-Type" 
      content="text/html; charset=Windows-31J">
</head>

<body>
<!-- (1)<FORM>タグにmultipart/form-dataを指定 -->
<form method="POST" 
      enctype="multipart/form-data" 
      action="UploadFile">
  <!-- (2)ファイルを選択する<input type="file">タグを指定 -->
  <input type="file" name="filefd" />
  <input type="submit" value="送信" />
</form>
</body>
</html>
(1). ファイルをアップロードする際は、<FORM>タグのenctype属性に"multipart/form-data"を指定します。これはRFC 1867に規定されています。action属性にSubmitボタンを押した際に遷移するServletプログラムを指定します。
(2). アップロードするファイルを選択する<input type="file">タグを指定します。タグにはname属性を指定する必要があります。
Servletプログラムの作成
FileUploadライブラリを使用したServletプログラムを作成します。
【UploadFileServlet.java】
package pack;

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.disk.*;
import org.apache.commons.fileupload.servlet.*;

public class UploadFileServlet extends HttpServlet {
  public void doPost(HttpServletRequest req, 
                     HttpServletResponse res) 
                     throws ServletException, IOException {

    //(1)アップロードファイルを格納するPATHを取得
    String path = getServletContext().getRealPath("files");

    //(2)ServletFileUploadオブジェクトを生成
    DiskFileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
    
    //(3)アップロードする際の基準値を設定
    factory.setSizeThreshold(1024);
    upload.setSizeMax(-1);
    upload.setHeaderEncoding("Windows-31J");

    try {
      //(4)ファイルデータ(FileItemオブジェクト)を取得し、
      //   Listオブジェクトとして返す
      List list = upload.parseRequest(req);

      //(5)ファイルデータ(FileItemオブジェクト)を順に処理
      Iterator iterator = list.iterator();
      while(iterator.hasNext()){
        FileItem fItem = (FileItem)iterator.next();
      
        //(6)ファイルデータの場合、if内を実行
        if(!(fItem.isFormField())){
          //(7)ファイルデータのファイル名(PATH名含む)を取得
          String fileName = fItem.getName();
          if((fileName != null) && (!fileName.equals(""))){
            //(8)PATH名を除くファイル名のみを取得
            fileName=(new File(fileName)).getName();
            //(9)ファイルデータを指定されたファイルに書き出し
            fItem.write(new File(path + "/" + fileName));
          }
        }
      }
    }catch (FileUploadException e) {
      e.printStackTrace();
    }catch (Exception e) {
      e.printStackTrace();
    }
    //(10)upFile.htmlページに戻る
    res.sendRedirect("upFile.html");
  }
}
(1). getRealPathメソッドを使用し、引数に指定された値のPATH名を取得します。このPATH名の配下にアップロードされたファイルを保存します。
(2). DiskFileItemFactoryオブジェクトを引数に、ServletFileUploadオブジェクト uploadを生成します。
(3). DiskFileItemFactoryオブジェクト、ServletFileUploadオブジェクトの各メソッドを使用し、アップロードの際に基準となる基準値を設定します。
(4). parseRequestメソッドを使用し、reqオブジェクトからファイルデータ(FileItemオブジェクト)を取得し、Listオブジェクトとして返します。
(5). Iteratorインタフェース を使用し、listオブジェクトに格納されたFileItemオブジェクトを順に取り出し、処理を行います。
(6). ファイルデータであった場合(isFormFieldメソッドでfalseの場合)、if内を実行します。
(7). getNameメソッドを使用し、アップロードされたファイルデータのファイル名を取得します。ファイル名にはPATH名も含まれています。
(8). FileオブジェクトのgetNmaeメソッドは指定されたファイルのファイル名のみ(PATH名含まず)を取得するメソッドです。ファイル名のみをfileName変数に格納します。
(9). writeメソッドを使用し、ファイルデータを指定されたファイルに書き出します。書き出すファイルは(1)で取得したPATH名と(8)で取得したファイル名になります。
(10). ファイルアップロード処理が終わると、再びupFile.htmlページに戻ります。
web.xmlの設定
web.xmlに<servlet>タグと<servlet-mapping>タグを指定します。
【web.xml】
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
            http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<web-app>
  <servlet>
    <servlet-name>UploadFileServlet</servlet-name>
    <servlet-class>pack.UploadFileServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>UploadFileServlet</servlet-name>
    <url-pattern>/UploadFile</url-pattern>
  </servlet-mapping>
</web-app>
実行
使用例で作成したプログラムの簡易な実行方法を記載します。詳細はJavaの道:Tomcat(プログラム配置・実行)を参照してください。
(1). UploadFileServlet.javaをコンパイルします。コンパイルする際のCLASSPATHにはservlet-api.jar、commons-fileupload-1.1.1.jar、commons-io-1.2.jarを含めます。
(2). upFile.html、UploadFileServlet.class、web.xmlを適切なディレクトリ配下に設置します。使用例のコンテキスト名はTESTです。
(3). コンテキスト配下($CATALINA_HOME\webapps\TEST)にfilesディレクトリを作成します。
(4). Tomcatを起動し、upFile.htmlファイルにアクセスしファイルアップロードを行います。filesディレクトリにアップロードしたファイルが生成されています。



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道