Jakarta Commonsによるファイルのアップロード

 サーブレット/JSPでファイルのアップロードを手軽に行う方法として、このページでは Jakarta Commons のファイルアップロード(FileUpload)パッケージを使ったプログラムをご紹介します。
ファイルのアップロード機能を使うには、 Jakarta CommonsのFileUploadパッケージとBeanUtilsパッケージが必要です。 (環境によっては、Loggingパッケージも必要なことがあります) 両方ともバイナリアーカイブを展開するとjarファイルがあるので、 それらをWebアプリケーションのWEB-INF/libディレクトリに配置して使います。 環境はWindows XP Home Edition、J2SE SDK 1.4.2_03、 Jakarta Tomcat 5.0.16で、 FileUploadのバージョンは1.0、BeanUtilsのバージョンは1.6.1です。

まずは、ファイルのアップロードを求める入力フォームを持つHTML文書、「index.html」です。 これは普通の書き方で、特に注意点はありません。

<html>
<head><title>Jakarta Commonsを使ったファイルアップロードサンプル</title></head>
<body bgcolor="white">

<form action="upload.jsp"
  method="POST" name="FORM1" enctype="multipart/form-data">
ファイル:
<input type="file" name="filename" size="40"><br>
<input type="submit" value="登録">
</form>
</body>
</html>

そして、そのフォームがSubmitされると飛ぶJSPスクリプト、 「upload.jsp」です。

<%@ page language="java" contentType="text/html;charset=Shift_JIS" %>
<%@ page import="java.util.*, org.apache.commons.fileupload.*" %>
<html>
<head><title>Jakarta Commonsを使ったファイルアップロードサンプル</title></head>
<body bgcolor="white">

<%
  /*
   * Jakarta Commonsのファイルアップロードを使用するには、
   * FileUploadパッケージとBeanUtilsパッケージが必要です。
   */
  String encoding = "SJIS";
  DiskFileUpload upload = new DiskFileUpload();
  upload.setSizeMax(100000);
  upload.setRepositoryPath("/temp");

  List items = upload.parseRequest(request);
  Iterator iter = items.iterator();
  while(iter.hasNext()) {
    FileItem item = (FileItem) iter.next();
    long size = item.getSize();
    /* ↑クライアントに存在しないファイル名が */
    /* 入力された場合、0になります。 */
    String clientFileName = item.getName();
    String content = item.getString(encoding);
%>
<table border="1">
<tr>
  <td bgcolor="#cccccc">サイズ</td><td><%= size %></td>
  <td bgcolor="#cccccc">クライアント上のファイル名</td><td><%= clientFileName %></td>
</tr>
<%
    /* 1行ずつ切り出して処理します。*/
    StringTokenizer stok = new StringTokenizer(content, "\n");
    while(stok.hasMoreTokens()){
      String line = stok.nextToken();
%>
      <tr><td colspan="4"><%= line %></td></tr>
<%
    }
%>
</table>
<%
  }
%>
</body>
</html>

 まず、page import擬似命令でパッケージ org.apache.commons.fileupload.* をインポートします。 DiskFileUploadオブジェクトのメソッド setSizeMaxでアップロードされるファイルの最大サイズを指定できます。 最大サイズを越えるファイルがアップロードされようとすると、FileUploadExcepionが飛びます。 で、getString メソッドでアップロードされたファイルの内容を取得できます。 引数にエンコーディング名を指定することができ、ここではSJISと指定しています。
 なお、クライアントPC上に存在しないファイル名が指定された場合は、 getSizeメソッドが返すサイズが0となります。


アップロードされたファイルを保存する

 上の例は、アップロードされたファイルをそのまま開いて、 内容を見ながら何かする、という例でした。 しかし、添付ファイルなどの場合で、 アップロードされたファイルをそのままサーバ上のどこかに保管するだけ、 という処理を行うこともあります。 このときは、FileItem.write(String)を使うと簡単です。

<%@ page language="java" contentType="text/html;charset=Shift_JIS" %>
<%@ page import="java.util.*,java.io.File,org.apache.commons.fileupload.*" %>
<%--
upload-store.jsp
アップロードされたファイルを、作業ディレクトリ以外の特定のディレクトリに
出力して保管するサンプルです。
--%>
<html><body>
<%
final String tempDir = "C:/temp";
final String storeDir = "C:/usr/javadeploy/app01/upload/store";

DiskFileUpload upload = new DiskFileUpload();
upload.setSizeMax(1000000);
upload.setRepositoryPath(tempDir);

List items = upload.parseRequest(request);

for (Iterator iter = items.iterator(); iter.hasNext();) {
    FileItem item = (FileItem) iter.next();
    String clientFileName = item.getName();
    String storeFileName = storeDir + "/" + "abc.dat";
    item.write(new File(storeFileName));
%>
アップロードされた「<%= clientFileName %>」をサーバのディスクに保存しました。<br>
<%
}
%>
</body></html>

FileItem.write()メソッドの引数には、サーバ上の保存するパスを持つ、 Fileオブジェクトを指定します。

Java kowaza Top

(first uploaded 2003/03/21 last updated 2004/05/25, URANO398)

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル