一次上传多个文件到Struts2 @Action [英] Upload multiple files at once to a Struts2 @Action

查看:149
本文介绍了一次上传多个文件到Struts2 @Action的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要使用Struts2一次性上传1000个文件或一个包含所有文件的zip文件。 (通过1000个文件或一个zip文件,我的意思是我需要所有的文件上传到系统,如果用户一次选择所有的1000个文件或压缩他们,并作为一个单一的文件上传,并不重要,所以我期待一个更容易实现,更高效的)

我已经阅读了以下答案,但没有一个适合这个目的。





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


$ b

upload.jsp

 <%@ page contentType =text / htmlpageEncoding =UTF-8%> 
<!DOCTYPE html>
< html>
< head>
< meta http-equiv =Content-Typecontent =text / html; charset = UTF-8>
< title> JSP页< / title>
< / head>
< body>
< form action =uploadenctype =multipart / form-datamethod =post>
< input name =filestype =filemultiple />
< button type =submit/>
< / form>
< / body>
< / html>

upload.java

  @Action 
public class upload implements Addresses {

private List< File> files = new ArrayList< File> ();

public String execute(){

returnsuccess;

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(){
返回文件;

$ b $ 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);




输出

 上传1 
上传2

$我建议你使用Struts标签而不是普通的HTML标签,并且扩展ActionSupport(返回它的Result常量,而不是手动的创建结果String,就像结果)。



也就是说,这是一个经过测试和工作的例子。注意:它不适用于老版本的IE,但是由于您在自己的问题中使用了HTML5,所以我敢打赌,您已经知道这一点,而您并不是针对旧的IE。

$ hr
$ b

JSP

< pre class =lang-xml prettyprint-override> <%@ page contentType =text / html; charset = UTF-8%>
<!DOCTYPE html>
< html>
< head>
< meta http-equiv =Content-Typecontent =text / html; charset = UTF-8>
< title>多文件上传示例< / title>
< / head>
< body>
< s:file name =filesmultiple =multiple/>
< s:submit value =上传文件/>
< / s:form>
< / body>
< / html>

请注意 multiple =multiple部分:即使在官方文档中 < s:file /> 标记没有被定义,因为Struts 2.1是允许的,因为


动态属性允许:
true

这意味着它将按照原样绘制,而不受Struts的干扰。这样,每次HTML5提供一个新的功能,Struts都不需要更新标签;你可以把 foo =bar放在允许动态属性的标签中(< s:file /> < s:textarea /> 等),并且您将在HTML中找到它。

动作

  public class上传延伸ActionSupport {

private List<文件>文件;
私人清单< String> filesContentType;
私人清单< String> filesFileName;
$ b $ * GETTERS AND SETTERS * /

public String execute()throws Exception {
System.out.print(\\\
\\\
-- -------------------------------------);
int i = 0;
for(File file:files){
System.out.print(\\\
File [+ 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(\\\
------------------------------- -------- \\\
);
回报SUCCESS;
}

}

然后您可能要设置请求的最大大小和每个单个文件的最大大小在这里描述
$ b struts.xml - 最大多部分大小:

 < constant name =struts.multipart.maxSizevalue =20000000/> 

Struts.xml - 文件的最大大小(全局为一个包或本地为一个Action)


$ b

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


I need to upload "1000 files" or "a zip file including all the files" at once using Struts2. (By 1000 Files or a zip file, I mean I need all the files to be uploaded on the system it does not matter if user choose all the 1000 files at once or zip them and upload as a single file, so I am looking for the one which is easier to implement and more efficient)

I have read the following answers but none of them suits the purpose.

Using the following code, when I use a simple List files; it shows name of lists, but when I use List files it does not show any thing and I can not upload the files.

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);
    }
}

Output

in upload 1
in upload 2

解决方案

I suggest you to use Struts Tags instead of plain HTML tags, and to extend ActionSupport (returning its Result constants instead of manually composing the result String, like "result").

That said, this is a tested and working example.

Note: It won't work on old versions of IE, but since you are using HTML5 in your own question, I bet you already know it and you are not targeting old 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>

Note about the multiple="multiple" part: even if in the official documentation, that attribute for the <s:file /> tag is not defined, since Struts 2.1 it is allowed because of

Dynamic Attributes Allowed: true

this means that it will be drawn on the JSP as-is, without any interference by Struts. This way Struts doens't need to update its Tags each time HTML5 provides a new feature; you could put foo="bar" too in a tag that allows Dynamic Attributes (<s:file />, <s:textarea />, etc), and you will find it in the HTML.

Action

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

}

Then you may want to set the maximum size of the Request, and the maximum size of each single file, like described here:

Struts.xml - Max multipart size:

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

Struts.xml - Max size of a file (globally to a package, or locally to an Action)

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

这篇关于一次上传多个文件到Struts2 @Action的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆