一次上传多个文件到Struts2 @Action

我需要使用Struts2一次性上传“1000个文件”或“一个包含所有文件的zip文件”。 (通过1000个文件或一个zip文件,我的意思是我需要所有的file upload到系统,如果用户一次select所有的1000个文件或压缩他们,并作为一个单一的file upload,并不重要,所以我期待一个更容易实现和更有效的)

我已阅读以下答案,但没有一个适合这个目的。

  • Struts2file upload
  • 如何使用HTTP POSTselect并上传多个HTML和PHP文件?

使用下面的代码,当我使用一个简单的List文件; 它显示名单的名字,但是当我使用列表文件它不显示任何东西,我不能上传文件。

upload.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <form action="upload" enctype="multipart/form-data" method="post"> <input name="files" type="file" multiple/> <button type="submit"/> </form> </body> </html> 

upload.java

 @Action public class upload implements Addresses { private List <File> files = new ArrayList <File> (); public String execute(){ return "success"; } public upload() { System.out.println("in upload 1"); for(int i=0;i<files.size();i++) System.out.println(i + ")" + files.get(i)); System.out.println("in upload 2"); } public List <File> getFiles() { return files; } public void setFiles(List <File> files) { this.files = files; for(int i=0;i<files.size();i++) System.out.println(i + ")" + files.get(i)); // File fileToCreate = new File("c:\image", files.get(i).toString()); // FileUtils.copyFile(files.get(i), fileToCreate); } } 

产量

 in upload 1 in upload 2 

我build议你使用Struts标签而不是普通的HTML标签,并且扩展ActionSupport(返回它的Result常量而不是手工编写结果String,就像“result”一样)。

这就是说,这是一个经过testing和工作的例子

注意:它不适用于旧版本的IE,但是因为您在自己的问题中使用了HTML5,所以我敢打赌,您已经知道了这一点,而不是针对旧的IE。


JSP

 <%@page contentType="text/html; charset=UTF-8" %> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Multiple File Upload Example</title> </head> <body> <s:form action="upload" enctype="multipart/form-data" > <s:file name="files" multiple="multiple" /> <s:submit value="Upload files" /> </s:form> </body> </html> 

关于multiple="multiple"部分的注意事项:即使在官方文档中, <s:file />标签的属性没有定义 ,因为Struts 2.1是允许的,因为

dynamic属性允许: true

这意味着它将在JSP上被绘制,而不受Struts的干扰。 这样,每次HTML5提供一个新的function,Struts都不需要更新标签; 你也可以在允许dynamic属性的标签( <s:file /><s:textarea />等)中加上foo="bar" ,你可以在HTML中find它。

行动

 public class Upload extends ActionSupport{ private List<File> files; private List<String> filesContentType; private List<String> filesFileName; /* GETTERS AND SETTERS */ public String execute() throws Exception{ System.out.print("\n\n---------------------------------------"); int i=0; for (File file : files){ System.out.print("\nFile ["+i+"] "); System.out.print("; name:" + filesFileName.get(i)); System.out.print("; contentType: " + filesContentType.get(i)); System.out.print("; length: " + file.length()); i++; } System.out.println("\n---------------------------------------\n"); return SUCCESS; } } 

然后,您可能需要设置请求最大大小以及每个单个文件最大大小 , 如下所述 :

Struts.xml – 最大多部分大小:

 <constant name="struts.multipart.maxSize" value="20000000" /> 

Struts.xml – 文件的最大大小(全局为一个包,或本地为一个Action)

 <interceptor-ref name="fileUpload"> <param name="maximumSize">10485760</param> </interceptor-ref> 

在JSP文件中: –

 <form action="doUpload" enctype="multipart/form-data" method="post"> <s:file name="fileUpload" multiple="multiple" label="Pick files" size="30"/> <br/> <s:submit value="Upload All" /> </form> 

在.java文件中

  private File fileUpload[]; private String fileUploadFileName[]; private String fileUploadContentType[]; private String saveDirectory; /** setter and getter for all above variables**/ public String doUpload1()throws Exception{ for (int i=0; i<fileUpload.length;i++){ File uploadedFile = fileUpload[i]; String fileName = fileUploadFileName[i]; File destFile = new File(saveDirectory + File.separator + fileName); try { FileUtils.copyFile(uploadedFile, destFile); } catch (IOException ex) { System.out.println("Could not copy file " + fileName); ex.printStackTrace(); } } return "success"; } 

这是一个为我工作,希望将为你工作,请让我知道,如果有任何问题。