Tomcat7でアップロードされたファイルを取得するには、Commons FileUploadを利用します。
Commons FileUploadを利用しない場合、かなり面倒なプログラムを組む必要があると思いますが、Commons FileUploadを使えばかなり簡単にアップロードしたファイルを取得出来ます。

■目次


前提条件

Tomcat7
JDK1.6
Commons FileUpload 1.3
Commons IO 2.4

ライブラリの準備

Commons FileUpload

Commons FileUploadを上記のアドレスからダウンロードします。
今回は「commons-fileupload-1.3-bin.zip」をダウンロードしました。

ダウンロード出来たら「commons-fileupload-1.3-bin.zip」の中から「commons-fileupload-1.3.jar」を取り出し、プロジェクトの「/WEB-INF/lib」ディレクトリに配置します。
eclipse等IDEでも「commons-fileupload-1.3.jar」をビルドパスに追加しましょう。
追加しないとコンパイルエラーが出ます。

Commons IO

Commons IOも上記のアドレスからダウンロードしましょう。
今回は「commons-io-2.4-bin.zip」をダウンロードしました。

ダウンロード出来たら「commons-io-2.4-bin.zip」の中から「commons-io-2.4.jar」を取り出し、プロジェクトの「/WEB-INF/lib」ディレクトリに配置します。
こちらはIDEのビルドパスに追加しなくても大丈夫です。Commons FileUploadが内部的に使っているからコンパイルするだけなら不要なのです。

サンプルアプリ

web.xml の設定

<?xml version="1.0" encoding="ISO-8859-1"?>
 
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0">
 
  <!-- サーブレットの宣言 -->
  <servlet>
    <servlet-name>FileUploadSample</servlet-name>
    <servlet-class>FileUploadSample</servlet-class>
  </servlet>
 
  <!-- サーブレットとurlのマッピング -->
  <servlet-mapping>
    <servlet-name>FileUploadSample</servlet-name>
    <url-pattern>/up</url-pattern>
  </servlet-mapping>
 
</web-app>
 
  • web.xmlは特に代わり映えはしません。

サンプルJSP index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>[Tomcat] ファイルアップロードサンプル。</title>
</head>
<body>
  <h1>[Tomcat] ファイルアップロードサンプル。</h1>
  <form method="POST" enctype="multipart/form-data" action="up">
  ファイル : <input type="file" name="upfile"><br/>
  メモ : <input type="text" name="note"><br/>
  <br/>
  <input type="submit" value="Press"> ファイルをアップロードします!
  </form>
</body>
</html>
 
  • ファイルをアップロードする時は、formタグのメソッドを「POST」、enctypeを「multipart/form-data」にします。
  • JSPファイルになっていますが、JSPである必要性のないJSPファイルになってしまいました。

サンプルサーブレット FileUploadSample.java

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
 
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
 
/**
 * [Tomcat] ファイルアップロードサンプル。
 */
public class FileUploadSample extends HttpServlet {
  // (1) ファイルアップロードする時は、doPostメソッドを使います。
  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    // (2) アップロードファイルを受け取る準備
    // ディスク領域を利用するアイテムファクトリーを作成
    DiskFileItemFactory factory = new DiskFileItemFactory();
 
    // tempディレクトリをアイテムファクトリーの一次領域に設定
    ServletContext servletContext = this.getServletConfig().getServletContext();
    factory.setRepository((File) servletContext.getAttribute("javax.servlet.context.tempdir"));
 
    // ServletFileUploadを作成
    ServletFileUpload upload = new ServletFileUpload(factory);
 
    try {
      // (3) リクエストをファイルアイテムのリストに変換
      List<FileItem> items = upload.parseRequest(request);
 
      // アップロードパス取得
      String upPath = servletContext.getRealPath("/") + "upload/";
      byte[] buff = new byte[1024];
      int size = 0;
 
      for (FileItem item : items) {
        // (4) アップロードファイルの処理
        if (!item.isFormField()) {
          // ファイルをuploadディレクトリに保存
          BufferedInputStream in = new BufferedInputStream(item.getInputStream());
          File f = new File(upPath + item.getName());
          BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(f));
          while ((size = in.read(buff)) > 0) {
            out.write(buff, 0, size);
          }
          out.close();
          in.close();
 
          // アップロードしたファイルへのリンクを表示
          response.getWriter().print("<a href='");
          response.getWriter().print(servletContext.getContextPath() + "/upload/" + item.getName());
          response.getWriter().print("'>" + item.getName() + "</a>");
 
          // (5) フォームフィールド(ファイル以外)の処理
        } else {
          // ここでは処理せず、直接requestからgetParamしてもいいと思います。
        }
      }
    } catch (FileUploadException e) {
      // 例外処理
    }
    response.getWriter().flush();
  }
}
 

サンプルサーブレットのポイント

  • 1.ファイルアップロードする時は、doPostメソッドを使います。
    • htmlの方でメソッドを「POST」にした場合、Servletで受け取る時は「doPost」になります。
  • 2.アップロードファイルを受け取る準備
    • 特に説明することもないと思います。
    • オブジェクト作ったり、ファイルの一時領域を設定してます。
  • 3.リクエストをファイルアイテムのリストに変換
    • List<FileItem> items = upload.parseRequest(request);
      • ここでリクエストをファイルアイテムのリストに変換しています。
  • 4.アップロードファイルの処理
    • ここでは、アップロードされたファイルやパラメータの処理を行います。
    • 「FileItem.isFormField()」このメソッドでfalseが返って来たらファイルだと思っていいです。
      • trueだったら、ファイル以外のフォームフィールドです。
    • 今回行なっているのは、アップロードされたファイルを「/upload/~」にコピーして、コピー先へのリンクを表示する処理です。
  • 5.フォームフィールド(ファイル以外)の処理
    • ここでは、ファイル以外のフィールドの処理を記述します。
    • 今回は、「フィールド名 : 値」を表示するだけの簡単な処理にしてあります。

サンプルダウンロード


コメント(バグ、間違い、こんな情報が欲しい等ありましたら)

名前:

アンケート(このページの情報はお役に立ちましたか?)

順位 選択肢 得票数 得票率 投票
1 今日の晩飯は、カレー 49 (42%)
2 役に立った 33 (28%)
3 ありがとう 12 (10%)
4 分かりにくい 8 (7%)
5 はらへった 6 (5%)
6 役に立たない 5 (4%)
7 間違っている 3 (3%)
8 3 1 (1%)
その他
投票総数 117