JavaSer/javadrive/upload

Last-modified: 2010-10-15 (金) 18:49:26

Jakarta Commons FileUploadについて

 FileUploadはWebでブラウザからFileをアップロードするライブラリ(要インストール)
 ファイルのアップロード処理を自分で実装すると、いろいろ面倒くさいが、
 FileUploadを使うとサクッとアップロードできる。

 サーバへのファイルアップロードを行う時に利用する

Jakarta Commons FileUploadを使ったファイルアップロードプログラムのひな形


public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload sfu = new ServletFileUpload(factory);

try {
List list = sfu.parseRequest(request);
Iterator iterator = list.iterator();

while(iterator.hasNext()){
FileItem item = (FileItem)iterator.next();;

/* 取り出したFileItemに対する処理 */
}

}catch (FileUploadException e) {
e.printStackTrace();
}
}

アップロードされたファイルの判別

 クライアントからフォーム経由で送られて来るものは、アップロードしたいファイルだけではなく、
 フォームの他のコントロール(テキストやチェックボックス)のデータなども送られくる。

 FileItemオブジェクトとして取得できるものは、ファイルだけではなく
 テキストコントールに入力されたテキストということもある。

 そこでまずFileItemオブジェクトの中で、ファイルが添付されたものだけを選ぶようにする。
 そのためにはFileItemインターフェースで定義されている"isFormField"メソッドを使う。

 #もし該当のFileItemオブジェクトが、アップロードされたファイルで無ければTrueを返す

if (!item.isFormField()){
// アップロードされたファイルのみ対象の処理
}

アップロードされたファイルの名前の取得

 ファイル名の取得は item.getName(); を使えばOK

 1)
 ただし、


if ((filename != null) && (!filename.equals(""))){
// ファイル名に関する処理
}

 のようにして、ファイル名が空白でないことをチェックしたほうがよい

 2)
 ファイル名だけでなく、パスを含んでいることもあるので、
  filename = (new File(filename)).getName();
 のようにしたほうがよい。

 したがって、以下のようになる。

if (!item.isFormField()){
String filename = item.getName();

if ((filename != null) && (!filename.equals(""))){
// ファイル名に関する処理
filename = (new File(filename)).getName();
}
}

アップロードされたファイルの保存

 item.writeメソッドを使えばOK


String path = getServletContext().getRealPath("data");

if ((filename != null) && (!filename.equals(""))){
filename = (new File(filename)).getName();
item.write(new File(path + "/" + filename));
}

 #ただし、保存してようとしているファイル名が既にある場合など
  細かい点は調整が必要
 #また、上記プログラムをテストしたところ、該当するフォルダを
  あらかじめ作成しておかなければ正しくアップロードできないようだ