2011-11-30 60 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和无关的行动 –