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

时间:2013-05-06 06:58:37

标签: jsp file-upload struts2

我需要使用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>

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

2 个答案:

答案 0 :(得分:9)

我建议您使用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>

关于multiple="multiple"部分的注意事项:即使in the official documentation, that attribute for the <s:file /> tag is not defined,因为Struts 2.1因为

而被允许
  

允许动态属性:   的

这意味着它将在JSP as as is 上绘制,而不受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;
    }

}

然后,您可能需要设置请求的最大大小,以及每个文件的最大大小like described here

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

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

Struts.xml - 文件的最大大小(全局到包,或本地到Action)

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

答案 1 :(得分:0)

在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";
    }

这是一个为我工作,希望对你有用,如果有任何问题,请告诉我。