struts 2マルチファイルアップロード.

2336 ワード

一.デフォルトの方法
struts 2はファイルuploadをデフォルトパッケージ化しており、使いやすいです.
私は1つのプロジェクトで次のコードでマルチファイルのアップロードを実現しました.
<form action="xx.action" method="post" enctype="multipart/form-data">
       :<input type="file" name="upload" /><br>
       :<input type="file" name="upload" /><br>
       :<input type="file" name="upload" /><br>
<input value="  " type="submit" />
</form>

 
Actionでは、以下の行を定義するだけでアップロードされたファイルのリストを取得できます.
public class xxAction extends ActionSupport
{
    private File[] upload;
    private String[] uploadContentType;
    private String[] uploadFileName;

   //getter&setter
}

 
 
次はuploadを判断して、次のように実現しました...暗いバグを犯しました
if (upload != null) {
     if (upload[1] != null) { //    
              doA
     }
     if (upload.length>2 && upload[2] != null) { //    
		doB
     }
     if (upload.length>3 && upload[3] != null) { //    
		doC
     }

}

 ユーザーは順番に3枚の画像を転送してもいいですが、2番目のファイルだけを転送すればいいですか?取ったのはupload[1]だけで、理論的なdoBではなくdoAが実行される.
 
二.改良されたロジック
実はマルチファイルのアップロードに対して、以下のような実現方式を考えるともっと良いかもしれません:ラベル
 
      :<s:file name="upload1" />
      :<s:file name="upload2" />
      :<s:file name="upload3" />

 
アクションで定義:
public class xxxAction extends ActionSupport {
		// file upload
		private File upload1; //       
		private String upload1ContentType; //        
		private String upload1FileName; //       
		
		private File upload2; //       
		private String upload2ContentType; //        
		private String upload2FileName; //       
		
		private File upload3; //       
		private String upload3ContentType; //        
		private String upload3FileName; //       

  //getter &&setter
}

 マルチファイルを別々に処理し、struts 2はラベルのように自動的にfile情報にカプセル化できる