支柱2多文件上传


要实现这一点,客户端和服务器端都需要进行一些更改:


  • 客户端:使用多个<s:file>标签,允许用户根据需要拾取任意数量的文件。
  • 服务器端:在操作类中,将成员变量的类型从单个对象修改为数组或列表,如下所示:
  1. 文件X指向字符串[]X或列表<文件>X
  2. 字符串XFileName指向字符串[]XFileName或列表<String>XFileName
  3. 字符串XContentType指向字符串[]XContentType或列表<String>XContentType



其中X是上载表单中的文件<s:file>标签的名称,例如:

<s:file name="fileUpload" />

那么X将是“fileUpload”。因此,在诉讼类中:

File[] fileUpload;
String[] fileUploadFileName;
String[] fileUploadContentType;

或者:

List<File> fileUpload;
List<String> fileUploadFileName;
List<String> fileUploadContentType;

请记住为这些变量正确创建getter和setter。

1.关于上传多个文件示例

下面的示例程序演示了如何使用Struts2框架实现上传多个文件的功能。该应用程序显示了一个上传表单,允许用户一次选择三个要上传的文件。

上传的文件被复制到应用程序的.struts.xmlfile中配置的位置。

让我们来看看这个示例应用程序是如何编码的。

2.编写上传表单代码

上传表单在pload.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" label="Pick file #1" size="30"/>
            <s:file name="fileUpload" label="Pick file #2" size="30"/>
            <s:file name="fileUpload" label="Pick file #3" size="30"/>
            <br/>
            <s:submit value="Upload All" />
        </s:form>
    </center>
</body>
</html>


提交此表单时,将调用操作ploadFile。

3.编写Action类代码

在MultipleFilesUploadAction.java文件中实现Struts 2的动作类,如下所示:

package com.geekonjava.struts;

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”与pload.jsp文件中<s:file>标记的name属性值匹配。Struts2的拦截器fileUpload将通过setter获取这些变量的数据。
  • 变量saveDirectory的值由Struts2的staticParams拦截器通过相应的setter进行设置,该值可以在struts.xml文件中直接配置。
  • 动作类的入口方法doUpload()将上传的文件从临时目录复制到saveDirectory变量指定的位置,然后重定向到“Success”视图,即结果页面。

了解更多信息>Geek On Java<