2011-11-30 63 views
2

我想上傳一個表單中的多個文件,這個文件的數量因用戶而異,例如,用戶可以上傳2個文件,另一個用戶可以上傳12個文件。我想知道如何在jsp struts2表單中創建一個循環或其他東西,這樣當用戶上傳文件時,它會將其名稱添加到列表中,並且他/她可以上傳另一個文件並將其添加到列表中,等等。Struts2文件上傳

回答

1

我實現了這個利用兩個struts2的插件,它是,Struts2的jQuery插件和Struts2的範圍插件

答案如下所示:

包括那些依賴於你的Maven POM文件:

 <dependency> 
      <groupId>com.jgeppert.struts2.jquery</groupId> 
      <artifactId>struts2-jquery</artifactId> 
      <version>3.2.0</version> 
      <type>pom</type> 
     </dependency> 
     <dependency> 
      <groupId>com.googlecode.struts2scopeplugin</groupId> 
      <artifactId>struts2-scope-plugin</artifactId> 
      <version>1.0.4</version> 
     </dependency> 

,我們創建一個類如下準備形式:

public class PrepareUpload extends ActionSupport{ 
    @In (scope=ScopeType.CONVERSATION) 
     @Out (scope=ScopeType.CONVERSATION) 
     private List<File> fileUploadi = new ArrayList<File>(); 

     @In (scope=ScopeType.CONVERSATION) 
     @Out (scope=ScopeType.CONVERSATION) 
     private List<String> fileUploadContentTypei = new ArrayList<String>(); 

     @In (scope=ScopeType.CONVERSATION) 
     @Out (scope=ScopeType.CONVERSATION) 
     private List<String> fileUploadFileNamei = new ArrayList<String>(); 

    @Action(value = "/prepareupload", results = { 
      @Result(location = "upload.jsp", name = "success") 
      }) 
      @End 
    public String execute() throws Exception 

     { 
     return SUCCESS; 

     } 

    public List<File> getFileUploadi() { 
     return fileUploadi; 
    } 

    public void setFileUploadi(List<File> fileUploadi) { 
     this.fileUploadi = fileUploadi; 
    } 

    public List<String> getFileUploadContentTypei() { 
     return fileUploadContentTypei; 
    } 

    public void setFileUploadContentTypei(List<String> fileUploadContentTypei) { 
     this.fileUploadContentTypei = fileUploadContentTypei; 
    } 

    public List<String> getFileUploadFileNamei() { 
     return fileUploadFileNamei; 
    } 

    public void setFileUploadFileNamei(List<String> fileUploadFileNamei) { 
     this.fileUploadFileNamei = fileUploadFileNamei; 
    } 

} 

,並在添加一個類列出並處理Ajax撥打如下:

public class UploadAction extends ActionSupport { 

    private static final long serialVersionUID = 7968544374444173511L; 
    private static final Log log    = LogFactory.getLog(UploadAction.class); 


    private String   echo; 
    @In (scope=ScopeType.CONVERSATION) 
    @Out (scope=ScopeType.CONVERSATION) 
    private List<File> fileUploadi = new ArrayList<File>(); 
    private List<File> fileUpload = new ArrayList<File>(); 
    @In (scope=ScopeType.CONVERSATION) 
    @Out (scope=ScopeType.CONVERSATION) 
    private List<String> fileUploadContentTypei = new ArrayList<String>(); 
    private List<String> fileUploadContentType = new ArrayList<String>(); 
    @In (scope=ScopeType.CONVERSATION) 
    @Out (scope=ScopeType.CONVERSATION) 
    private List<String> fileUploadFileNamei = new ArrayList<String>(); 
    private List<String> fileUploadFileName = new ArrayList<String>(); 
    @Action(value = "/uploada", results = { 
    @Result(location = "simpleecho.jsp", name = "success") 
    }) 
    @Begin 
    public String execute() throws Exception 
    { 

fileUploadi.addAll(fileUpload); 
fileUploadFileNamei.addAll(fileUploadFileName); 
fileUploadContentTypei.addAll(fileUploadContentType); 
    for (int i = 0; i < fileUploadFileNamei.size(); i++) 
    { 
     if (echo == null) 
      echo = fileUploadFileNamei.get(i); 
     else 
     echo += "<br>" + fileUploadFileNamei.get(i); 
    log.info(echo); 
    } 
    return SUCCESS; 
    } 

    public String getEcho() 
    { 
    return echo; 
    } 


    public List<File> getFileUpload() { 
     return fileUpload; 
    } 

    public void setFileUpload(List<File> fileUpload) { 
     this.fileUpload = fileUpload; 
    } 

    public List<String> getFileUploadContentType() { 
     return fileUploadContentType; 
    } 

    public void setFileUploadContentType(List<String> fileUploadContentType) { 
     this.fileUploadContentType = fileUploadContentType; 
    } 

    public List<String> getFileUploadFileName() { 
     return fileUploadFileName; 
    } 

    public void setFileUploadFileName(List<String> fileUploadFileName) { 
     this.fileUploadFileName = fileUploadFileName; 
    } 

    public List<File> getFileUploadi() { 
     return fileUploadi; 
    } 

    public void setFileUploadi(List<File> fileUploadi) { 
     this.fileUploadi = fileUploadi; 
    } 

    public List<String> getFileUploadContentTypei() { 
     return fileUploadContentTypei; 
    } 

    public void setFileUploadContentTypei(List<String> fileUploadContentTypei) { 
     this.fileUploadContentTypei = fileUploadContentTypei; 
    } 

    public List<String> getFileUploadFileNamei() { 
     return fileUploadFileNamei; 
    } 

    public void setFileUploadFileNamei(List<String> fileUploadFileNamei) { 
     this.fileUploadFileNamei = fileUploadFileNamei; 
    } 




    } 

終於JSP應該是這樣的:

<%@ taglib prefix="s" uri="/struts-tags" %> 
<%@ taglib prefix="sj" uri="/struts-jquery-tags"%> 

<html> 
<head> 
<sj:head jqueryui="true" defaultLoadingText="Please wait ..."/> 
<s:head /> 
</head> 

<body> 
<h1>File Upload:</h1> 

<s:form action="uploada" 
method="POST" enctype="multipart/form-data" theme="xhtml" > 

<s:file label="File:" name="fileUpload" size="40" /> 

<div id="result" >Add Files Below:</div> 
<sj:submit 
      targets="result" 
      button="true" 
      validate="true" 
      value="Add File" 
      indicator="indicator" 
      parentTheme="xhtml" 
      /> 
<sj:submit 
      button="true" 
      validate="true" 
      value="Submit" 
      indicator="indicator" 
      parentTheme="xhtml" 
      /> 

</s:form> 

</body> 
</html> 
+0

我怎樣才能改變它上傳多個文件一次? http://stackoverflow.com/questions/16393581/need-to-upload-multiple-files-at-once – J888

3

您可以在Struts2多個文件上傳使用生成feature.In你的JSP文件,你必須定義類似

<s:form action="doMultipleUploadUsingList" method="POST" enctype="multipart/form-data"> 
    <s:file label="File (1)" name="upload" /> 
    <s:file label="File (2)" name="upload" /> 
    <s:file label="FIle (3)" name="upload" /> 
    <s:submit /> 
</s:form> 

將這些文件發送到你的動作類,你必須收集文件的選項內容列表

public class MultipleFileUploadUsingListAction extends ActionSupport { 

    private List<File> uploads = new ArrayList<File>(); 
    private List<String> uploadFileNames = new ArrayList<String>(); 
    private List<String> uploadContentTypes = new ArrayList<String>(); 
    // There getter and setter methods 

} 

這裏

[File Name] : File - the actual File 
[File Name]ContentType : String - the content type of the file 
[File Name]FileName : String - the actual name of the file uploaded (not the HTML name) 

對於細節參考Struts2的

Multiple File Upload

的多文件上傳頁面顯示用戶可以選擇添加JSP頁面上的多個文件是如何想顯示that.All你需要的時候你給他照顧事文件上傳框的名字應該是相同的,這樣Struts2 param interceptor可以在你的Action類將它們作爲一個列表

+0

我知道如何使用這個動作和這個多重文件格式。我不知道的是如何使上傳的文件數量達到100例如 – Moe

+0

我可以做一個循環,例如,當他上傳一個文件時,它會添加一個文件,並要求他提供另一個文件上傳,當用戶提交形式我可以處理它的文件數組 – Moe

+0

是隻是一個UI iplimentation和無關的行動 –