一次将多个文件上传到 Struts2 @Action
Posted
技术标签:
【中文标题】一次将多个文件上传到 Struts2 @Action【英文标题】:Upload multiple files at once to a Struts2 @Action 【发布时间】:2013-04-29 21:41:11 【问题描述】:我需要使用 Struts2 一次上传“1000 个文件”或“一个包含所有文件的 zip 文件”。 (通过 1000 个文件或 zip 文件,我的意思是我需要将所有文件上传到系统上,无论用户一次选择所有 1000 个文件还是将它们压缩并作为单个文件上传,所以我正在寻找一种更容易实现和更高效的)
我已阅读以下答案,但没有一个适合目的。
Struts2 File Upload How can I select and upload multiple files with html and php, using HTTP POST?使用下面的代码,当我使用一个简单的List文件时;它显示列表的名称,但是当我使用列表文件时,它不显示任何内容并且我无法上传文件。
上传.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>
上传.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
【问题讨论】:
使用<script language="javascript">
已经很老了。 <script type="text/javascript">
、<script type="application/javascript">
甚至只是 <script>
怎么样?
扭曲你的问题:你能把1000个文件压缩成1个ZIP文件并上传,然后在服务器端解压并获取文件列表吗?
@ShivanRaptor 是的,问题已更新
@Jack...如果您可以上传一个包含 1000 个文件的 zip,那么它就是一个简单的文件上传...?!!您的问题与单个文件上传有何不同?
@JackRamzi 您应该具体说明您想要上传 1000 个文件还是 1 个 zip 文件。最后一个选项应该定义如何创建 zip。
【参考方案1】:
我建议您使用 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"
部分:即使in the official documentation, that attribute for the <s:file />
tag is not defined,由于 Struts 2.1 它是允许的,因为
允许的动态属性: 真
这意味着它将按原样在 JSP 上绘制,不受 Struts 的任何干扰。这样 Struts 就不需要在每次 HTML5 提供新特性时更新它的标签;您也可以将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;
那么你可能要设置请求的最大大小,以及每个文件的最大大小,like described here:
Struts.xml - 最大多部分大小:
<constant name="struts.multipart.maxSize" value="20000000" />
Struts.xml - 文件的最大大小(全局到包,或本地到动作)
<interceptor-ref name="fileUpload">
<param name="maximumSize">10485760</param>
</interceptor-ref>
【讨论】:
嗨,我尝试了确切的代码,但它不适用于 struts 2.5.13。文件名始终为 null 。你能帮我吗? 检查您的拦截器堆栈。小心:) 尤其是***.com/a/29211248/1654265 和***.com/a/33697612/1654265 我复制了上面给出的完全相同的东西。它适用于单个文件上传,但不适用于多个文件。从我升级到 struts 2.5.13 开始。 感谢您的回复安德烈。为 2.5.13 创建了新项目。一些 jar 有问题,可能是 javaassit。现在它在添加新罐子后工作。迁移人员没有正确添加罐子。再次感谢【参考方案2】:在 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";
这是一个对我有用的,希望对你有用,如果有任何问题请告诉我。
【讨论】:
以上是关于一次将多个文件上传到 Struts2 @Action的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法使用 vba/macro 一次将多个配置上传到 alm 中的测试用例?
如何一次将多个 csv 文件读取到 Google Colab