J88*_*888 9 jsp struts2 file-upload
我需要使用Struts2一次上传"1000个文件"或"包含所有文件的zip文件".(通过1000个文件或一个zip文件,我的意思是我需要在系统上传所有文件,如果用户一次选择所有1000个文件或者压缩它们并上传为单个文件,那么我无需重要,所以我正在寻找更容易实现和更有效的那个)
我已经阅读了以下答案,但它们都不符合目的.
使用下面的代码,当我使用一个简单的List文件时; 它显示了列表的名称,但是当我使用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>
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
产量
in upload 1
in upload 2
Run Code Online (Sandbox Code Playgroud)
我建议您使用Struts标签而不是纯HTML标签,并扩展ActionSupport(返回其结果常量而不是手动编写结果字符串,如"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>
Run Code Online (Sandbox Code Playgroud)
关于该multiple="multiple"
部分的注意事项:即使在官方文档中,<s:file />
标签的该属性未定义,因为Struts 2.1允许使用
动态属性允许: true
这意味着它将按原样在JSP上绘制,而不受Struts的任何干扰.这样,每次HTML5提供新功能时,Struts都不需要更新其标签; 你可以把foo="bar"
太多的标签,允许动态属性(<s:file />
,<s:textarea />
等等),你会发现它的HTML.
行动
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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可能需要设置请求的最大大小以及每个文件的最大大小,如下所述:
Struts.xml - 最大多部分大小:
<constant name="struts.multipart.maxSize" value="20000000" />
Run Code Online (Sandbox Code Playgroud)
Struts.xml - 文件的最大大小(全局到包,或本地到Action)
<interceptor-ref name="fileUpload">
<param name="maximumSize">10485760</param>
</interceptor-ref>
Run Code Online (Sandbox Code Playgroud)