我需要使用Struts2一次上传“ 1000个文件”或“包括所有文件的zip文件”。(通过1000个文件或一个zip文件,我的意思是我需要将所有文件都上传到系统上,无论用户一次选择所有1000个文件还是将它们压缩并作为一个文件上传都没有关系,所以我正在寻找一种更易于实现,更高效的方式)
当我使用一个简单的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
我建议您使用Struts标记而不是普通的HTML标记,并扩展ActionSupport(返回其Result常量,而不是手动组成结果字符串,例如“result”)。
就是说,这是一个 经过测试的有效示例 。
注意:它不适用于旧版本的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允许使用该属性,因为
multiple="multiple"
<s:file />
允许的动态属性: true
这意味着它将按 原样 在JSP上绘制,而不受Struts的干扰。这样,Struts不需要在每次HTML5提供新功能时都更新其标签。你可以把foo="bar"太多的标签,允许动态属性(<s:file/>,<s:textarea />等等),你会发现它的HTML。
foo="bar"
<s:file/>
<s:textarea />
行动
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; } }
然后,您可能需要设置 Request 的 最大大小以及每个单个文件 的 最大大小:
Struts.xml-最大分段大小:
<constant name="struts.multipart.maxSize" value="20000000" />
Struts.xml-文件的最大大小(全局到软件包,或本地到Action)
<interceptor-ref name="fileUpload"> <param name="maximumSize">10485760</param> </interceptor-ref>