|
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オブジェクトを指定します。
(first uploaded 2003/03/21 last updated 2004/05/25, URANO398)
|