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が内部的に使っているからコンパイルするだけなら不要なのです。
サンプルアプリ
<?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>
<%@ 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ファイルになってしまいました。
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.フォームフィールド(ファイル以外)の処理
- ここでは、ファイル以外のフィールドの処理を記述します。
- 今回は、「フィールド名 : 値」を表示するだけの簡単な処理にしてあります。
サンプルダウンロード
コメント(バグ、間違い、こんな情報が欲しい等ありましたら)
アンケート(このページの情報はお役に立ちましたか?)
最終更新:2025年02月19日 16:44