一次上传多个文件到一个Struts2的@Action(Upload multiple files a

2019-09-02 01:46发布

我需要同时使用Struts2的上传“1000个文件”或“一个zip文件,包括所有文件”。 (1000个文件或压缩文件,我的意思是我需要的所有文件,在系统上上传,如果用户选择所有的1000个文件一次或压缩它们并上传的单个文件也没关系,所以我要寻找在其中一个更容易实现,更高效)

我已阅读下面的答案,但他们都不适合的目的。

  • Struts2的文件上传
  • 如何选择并上传多个文件与HTML和PHP,使用HTTP POST?

使用下面的代码,当我用一个简单的列表文件; 它显示列表的名称,但是当我使用列表文件它不显示任何东西,我不能上传文件。

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

Answer 1:

我建议你使用Struts的标签,而不是普通的HTML标签,并延长了ActionSupport(手动返回其结果,而不是常量构成的结果字符串,如“结果”)。

也就是说,这是一个测试和工作的例子

注意:它不会在旧版本的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它是允许的,因为

动态属性允许:

这意味着它将在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;
    }

}

然后,你可能要设置请求的最大尺寸 ,并且每个单个文件的最大尺寸 , 喜欢这里描述 :

struts.xml的 - 最大尺寸多:

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

struts.xml中 - 的文件的最大尺寸(全局到一个包,或在本地一Action)

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


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

这是一个为我工作,希望能够为您服务,请让我知道如果任何问题。



文章来源: Upload multiple files at once to a Struts2 @Action