「Java/Tomcat/ファイルをアップロードするサンプル(Commons FileUplaod)」の編集履歴(バックアップ)一覧に戻る

Java/Tomcat/ファイルをアップロードするサンプル(Commons FileUplaod) - (2022/05/27 (金) 09:08:26) のソース

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

* ■目次
#contents(fromhere=true)

*前提条件
Tomcat7
JDK1.6
Commons FileUpload 1.3
Commons IO 2.4

* ライブラリの準備
** Commons FileUpload
- http://commons.apache.org/proper/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
- http://commons.apache.org/proper/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が内部的に使っているからコンパイルするだけなら不要なのです。

* サンプルアプリ
** &ref(web.xml)の設定
#highlight(){{
<?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 &ref(index.jsp)
#highlight(){{
<%@ 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ファイルになってしまいました。

** サンプルサーブレット &ref(FileUploadSample.java)
#highlight(){{
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.フォームフィールド(ファイル以外)の処理
-- ここでは、ファイル以外のフィールドの処理を記述します。
-- 今回は、「フィールド名 : 値」を表示するだけの簡単な処理にしてあります。

* サンプルダウンロード
&ref(web.xml)
&ref(index.jsp)
&ref(FileUploadSample.java)

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

* アンケート(このページの情報はお役に立ちましたか?)
#tvote("役に立った[49]","役に立たない[7]","分かりにくい[12]","間違っている[4]","ありがとう[21]","今日の晩飯は、カレー[130]","はらへった[15]","3[3]","お腹の肉が気になる[19]","私は神だ!!![11]","227[3]","&lt;script&gt;&lt;/script&gt;[2]","https://w.atwiki.jp/chapati4it/pages/154.html[1]","わかりやすかったですが、ソースコード箇所のファストビューの情報量を増やしてもらえるともっとみやすかったです。[1]")