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