Javaに関する様々な情報をご紹介します。

12ファイルアップロード

Javaに関する様々な情報をご紹介します。

ファイルアップロード

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 setSizeThr
eshold(int)
メモリにバッファする最大値をbytesで指定します。容量の大きなデータをアップロードする際は、最大値を超えた場合、バッファ内のデータは一時領域に保存されます。
void setRepos
itory(File)
setSizeThresholdメソッドで指定したバッファ最大値を超えた場合、バッファ内のデータを保存する一時領域を指定します。

ServletFileUploadクラス

Servletプログラムを経由して、ファイルデータを取得するクラスです。ファイルデータはFileItemオブジェクトが格納されたListコレクションとして、返されます。

戻り型 メソッド 説明
List parse
Request(
HttpServlet
Request)
RFC 1867に準拠した形式で送られてきたデータをFileItemオブジェクトに分割し、Listコレクションとして返します。送られてくるデータはHttpServletRequestオブジェクトから取得できます。
void setSizeMax アップロードできるデータ容量の最大値をbytesで指定します。無制限の場合は-1を指定します。
void setHeader
Encoding(
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. (1)ファイルをアップロードする際は、<FORM>タグのenctype属性に"multipart/form-data"を指定します。これはRFC 1867に規定されています。action属性にSubmitボタンを押した際に遷移するServletプログラムを指定します。
  2. (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. (1)getRealPathメソッドを使用し、引数に指定された値のPATH名を取得します。このPATH名の配下にアップロードされたファイルを保存します。
  2. (2)DiskFileItemFactoryオブジェクトを引数に、ServletFileUploadオブジェクト uploadを生成します。
  3. (3)DiskFileItemFactoryオブジェクト、ServletFileUploadオブジェクトの各メソッドを使用し、アップロードの際に基準となる基準値を設定します。
  4. (4)parseRequestメソッドを使用し、reqオブジェクトからファイルデータ(FileItemオブジェクト)を取得し、Listオブジェクトとして返します。
  5. (5)Iteratorインタフェース を使用し、listオブジェクトに格納されたFileItemオブジェクトを順に取り出し、処理を行います。
  6. (6)ファイルデータであった場合(isFormFieldメソッドでfalseの場合)、if内を実行します。
  7. (7)getNameメソッドを使用し、アップロードされたファイルデータのファイル名を取得します。ファイル名にはPATH名も含まれています。
  8. (8)FileオブジェクトのgetNmaeメソッドは指定されたファイルのファイル名のみ(PATH名含まず)を取得するメソッドです。ファイル名のみをfileName変数に格納します。
  9. (9)writeメソッドを使用し、ファイルデータを指定されたファイルに書き出します。書き出すファイルは(1)で取得したPATH名と(8)で取得したファイル名になります。
  10. (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ディレクトリにアップロードしたファイルが生成されています。

12ファイルアップロード