Home > PROGRAM SAMPLE > Java1.4.2+Struts1.1でファイルのアップロード

Java1.4.2+Struts1.1でファイルのアップロード

11月 15th, 2006

ひょんなことで、

Java+Strutsで、ファイルをアップロードする事になったので、
せっかくなので、その内容をポイントだけ覚書します。

ところで、ファイルアップロードする方法はいろいろあるけど、
ファイルのアップロードのタイミングってどうしてますか?

入力画面の後、確認ページを表示して、
最後の最後に、よかった時だけ、本当にUPしたいですよね。

なぜなら、一発目でUPすると、
確認ページでキャンセルされたとき、そのファイルは残っちゃうので、なんだかいやですよね。

そこでStrutsの、org.apache.struts.upload.FormFileっていう素敵なクラスを使って、最後に本当にUPしたい時にUPするプログラムを作りました。

この型のフィールドをActionFormにセットして、sessionで設定すると、複数個のファイルでも最後の最後に「登録」ボタンを押したときに、サーバに本当にUPする事ができましたよ。

詳しい方、ご指摘お願いしますね・・

1)ActionForm を作成する

import org.apache.struts.upload.FormFile;をインポートし、
private FormFile file;のようなフィールドを作成する。

submitすると勝手にファイルがActionFormに入ります。

複数ファイルを対応する場合は、
import java.util.List; のフィールドを作っておいてそこに、
submit時に現在formのファイル内容を保持するようにします。

XXForm bean= newXXForm();
bean.setFile(frm.getFile());
list.add(bean);
frm.setList(bean);

※このクラスには、コメントなど他の情報を乗せても平気です。

2)実際のアップロードは、確認ページの「登録」ボタンなどが押されたときのアクションで次のように取り出して、サーバーに保存します。

private void upload(XXForm frm, String root_path, String out_file_name) throws Exception {

FormFile fileUp = null;
InputStream is = null;
BufferedInputStream inBuffer= null;
FileOutputStream fos= null;
BufferedOutputStream outBuffer= null;

try{

fileUp = frm.getFile();

is = fileUp.getInputStream();

inBuffer = new BufferedInputStream(is);

fos = new FileOutputStream(root_path + “/” + out_file_name);

outBuffer = new BufferedOutputStream(fos);

int contents = 0;

while ((contents = inBuffer.read()) != -1) {
outBuffer.write(contents);
}

outBuffer.flush();

}finally{
if (outBuffer != null) {
try{
outBuffer.close();
}catch(Exception e){
//<エラーログ吐き出し処理>
}finally{
outBuffer = null;
}
}
if (fos != null) {
try{
fos.close();
}catch(Exception e){
//<エラーログ吐き出し処理>
}finally{
fos = null;
}
}
if (inBuffer != null) {
try{
inBuffer.close();
}catch(Exception e){
//<エラーログ吐き出し処理>
}finally{
inBuffer = null;
}
}
if (is != null) {
try{
is.close();
}catch(Exception e){
//<エラーログ吐き出し処理>
}finally{
is = null;
}
}

try{
fileUp.destroy();
}catch(Exception e){
//<エラーログ吐き出し処理>
}finally{
fileUp = null;
}

}

}

こんな風に簡単にできるのですが、なにせsessionに乗せるので、
ファイルの容量制限は、絶対にしないといけないし、

同じパソコン上で、タブブラウザを使ったり、「ファイル」から新しいWindowsを開いたりして同じ事をしようとすると,
sessionが重複しておかしくなるから、対策が必要ですよ~。

以上です。

PROGRAM SAMPLE

  1. No comments yet.
  1. No trackbacks yet.