一次将多个文件上传到 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

【问题讨论】:

使用&lt;script language="javascript"&gt; 已经很老了。 &lt;script type="text/javascript"&gt;&lt;script type="application/javascript"&gt; 甚至只是 &lt;script&gt; 怎么样? 扭曲你的问题:你能把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 &lt;s:file /&gt; tag is not defined,由于 Struts 2.1 它是允许的,因为

允许的动态属性:

这意味着它将按原样在 JSP 上绘制,不受 Struts 的任何干扰。这样 Struts 就不需要在每次 HTML5 提供新特性时更新它的标签;您也可以将foo="bar" 放入允许动态属性(&lt;s:file /&gt;&lt;s:textarea /&gt; 等)的标签中,您会在 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的主要内容,如果未能解决你的问题,请参考以下文章

一次将多个图像上传到 Firebase

有没有办法使用 vba/macro 一次将多个配置上传到 alm 中的测试用例?

记一次将本地工程上传到github的过程

如何一次将多个 csv 文件读取到 Google Colab

如何将多个(不同)文件上传到 Cloud Storage Firebase?

在 1 个请求中将多个文件从 Android 上传到 AppEngine