使用Struts 2中的单个文件标记上载多个文件

时间:2012-03-22 06:20:03

标签: java file-upload struts2 multiple-files

我想使用单个Struts 2文件标记上传多个文件。

与Gmail一样,我们使用CTRL键附加多个文件以选择多个文件。

我知道如何上传多个文件,但我想使用单个文件标记。

2 个答案:

答案 0 :(得分:1)

我在一个小图库应用程序中上传了多个文件。如果您的操作已设置为接收多个文件,那么它就像(警告这适用于除IE之外的几乎所有主要浏览器,因此您需要基于jQuery或flash的解决方案):

<s:form namespace="/gallery" action="image-upload" method="POST" enctype="multipart/form-data">
    <s:file name="image" multiple="multiple"/>
    <s:submit/>
</s:form>

您可能已经查看了设置最大文件大小的参数(对于单个文件),默认情况下,如果我没记错的话,这是2MB,并且最大文件总大小的值不同(即所有文件的大小相加在一起)。如果用户能够上传一个好的图像集合,那么增加后面的值非常有用,将此值设置为大约20 MB(在struts.xml中):

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

编辑:对于感兴趣的,从上面呈现的html是......

<form id="image-upload" name="image-upload" action="/PhotoGallery/gallery/image-upload.action" method="POST" enctype="multipart/form-data">
    <input type="file" name="image" value="" id="image-upload_image" multiple="multiple"/>
    <input type="submit" id="image-upload_0" value="Submit"/>
</form>

2014年2月更新(差不多2年后): Internet Explorer 10,Firefox,Opera,Chrome和Safari现在支持multiple属性。

Internet Explorer 9及早期版本不支持它。

答案 1 :(得分:1)

以下示例程序演示了如何使用Struts2框架实现上载多个文件的功能。该应用程序显示一个上传表单,允许用户一次拿起三个文件上传。 上传的文件将复制到应用程序的 struts.xml 文件中配置的位置。

让我们看看示例应用程序是如何编码的。 上传表单在 upload.jsp 页面中实现,如下所示:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>   
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Multiple Files Upload with Struts2</title>
</head>
<body>
    <center>
        <h2>Pick multiple files to upload</h2>
        <s:form action="uploadFile" enctype="multipart/form-data" method="post">
            <s:file name="fileUpload" multiple="multiple" label="Pick files" size="30"/>
           <br/>
            <s:submit value="Upload All" />
        </s:form>
    </center>
</body>
</html>

MultipleFilesUploadAction.java 文件中实现Struts2的操作类,如下所示:

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;

public class MultipleFilesUploadAction {
    private File[] fileUpload;
    private String[] fileUploadFileName;
    private String[] fileUploadContentType;

    /**
     * This is the path to save uploaded file, which is configured in struts.xml
     */
    private String saveDirectory;

    public String doUpload() {

        // copy the uploaded files into pre-configured location
        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";
    }

    public File[] getFileUpload() {
        return fileUpload;
    }

    public void setFileUpload(File[] fileUploads) {
        this.fileUpload = fileUploads;
    }

    public String[] getFileUploadFileName() {
        return fileUploadFileName;
    }

    public void setFileUploadFileName(String[] fileUploadFileNames) {
        this.fileUploadFileName = fileUploadFileNames;
    }

    public String[] getFileUploadContentType() {
        return fileUploadContentType;
    }

    public void setFileUploadContentType(String[] fileUploadContentTypes) {
        this.fileUploadContentType = fileUploadContentTypes;
    }

    public String getSaveDirectory() {
        return saveDirectory;
    }

    public void setSaveDirectory(String saveDir) {
        this.saveDirectory = saveDir;
    }
}

在这个POJO动作类中,我们使用三个数组来存储上传的文件:

private File[] fileUpload;
private String[] fileUploadFileName;
private String[] fileUploadContentType;
  • 请注意,“ fileUpload ”一词与name的值匹配 upload.jsp文件中<s:file>标记的属性。 Struts2的的 名为fileUpload的拦截器将获取这些变量的数据 通过二传手。
  • 变量saveDirectory的值通过相应设置 通过Struts2的staticParams拦截器设置setter,这个值可以 在struts.xml文件中配置。
  • 操作类'输入方法doUpload()复制上传的文件 从临时目录到指定的位置 saveDirectory变量,然后重定向到“成功”视图 结果页面。

结果页面 result.jsp - 非常简单,它显示了一条成功的消息:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Upload result</title>
</head>
<body>
    <center>
        <h2>The files were uploaded successfully</h2>
    </center>
</body>
</html>

我们通过应用程序的 struts.xml 文件连接上传表单页面,操作类和结果页面,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <constant name="struts.multipart.maxSize" value="20971520" /> <!-- 20MB -->

    <package name="fileUpload" extends="struts-default">

        <action name="uploadFile" class="com.example.struts.MultipleFilesUploadAction"
            method="doUpload">

            <param name="saveDirectory">E:/Test/Upload</param>

            <interceptor-ref name="fileUpload">
                <param name="allowedTypes">*/*</param>
                <param name="maximumSize">4194304</param> <!-- 4MB -->
            </interceptor-ref>

            <interceptor-ref name="staticParams"/>
            <interceptor-ref name="params" />
            <interceptor-ref name="validation" />
            <interceptor-ref name="workflow" />

            <result name="success" type="redirect">/result.jsp</result>
            <result name="input">/upload.jsp</result>
        </action>
    </package>

</struts>
  • 这里,拦截器fileUpload配置为允许所有文件 可以上载类型,并且单个文件的最大大小为 4MB。
  • 常量struts.multipart.maxSize限制允许的最大大小 对于多部分请求是20MB。这意味着上传的总大小 文件不能超过20MB。