Java1.4.2+Struts1.1でファイルのアップロード
ひょんなことで、
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が重複しておかしくなるから、対策が必要ですよ~。
以上です。