JS+Struts2多文件上传实例详解

JS+Struts2多文件上传实例详解

简介

在现代web应用中,文件上传功能变得越来越常见。本文将介绍如何使用JavaScript和Struts2框架实现多文件上传功能。

实现步骤

1. 在HTML中创建上传表单

首先,在HTML页面中创建文件上传表单。使用<input>元素来创建上传表单并指定type="file"。此外,我们还需在form元素中包含一个上传按钮,用来提交表单:

<form enctype="multipart/form-data">
    <input type="file" name="files" multiple>
    <button type="button" onclick="upload()">上传</button>
</form>

2. 编写JavaScript上传函数

创建上传表单后,我们需要编写JavaScript函数来上传文件。我们可以使用XMLHttpRequest对象向服务器提交表单数据。

function upload() {
    // 得到文件域
    var fileInput = document.getElementsByName("files")[0];

    // 创建FormData对象来构建表单数据
    var formData = new FormData();
    for (var i = 0; i < fileInput.files.length; i++) {
        formData.append("files", fileInput.files[i]);
    }

    // 创建XMLHttpRequest对象
    var xhr = new XMLHttpRequest();

    // 注册回调函数
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4) {
            if (xhr.status == 200) {
                console.log(xhr.responseText);
            } else {
                console.log("上传失败:" + xhr.statusText);
            }
        }
    }

    // 发送POST请求
    xhr.open("POST", "/upload");
    xhr.send(formData);
}

说明:

  • 通过document.getElementsByName("files")[0]获得文件域<input>元素。
  • 创建FormData对象来构造表单数据,并使用append()方法将每个文件添加到FormData中。
  • 创建XMLHttpRequest对象,并通过xhr.onreadystatechange注册回调函数。
  • 使用xhr.open()方法打开指定的URL,向服务器提交FormData对象。

3. 在Struts2中接收上传文件

接下来,我们需要编写Struts2 Action类来接收上传文件。

public class UploadAction extends ActionSupport {
    private List<File> files;
    private List<String> filesFileName;
    private List<String> filesContentType;

    public String execute() {
        try {
            for (int i = 0; i < files.size(); i++) {
                File file = files.get(i);
                String fileName = filesFileName.get(i);
                String contentType = filesContentType.get(i);
                System.out.println("上传文件:" + fileName + ",类型:" + contentType + ",大小:" + file.length());
            }
        } catch (Exception e) {
            e.printStackTrace();
            return ERROR;
        }

        return SUCCESS;
    }

    public List<File> getFiles() {
        return files;
    }

    public void setFiles(List<File> files) {
        this.files = files;
    }

    public List<String> getFilesFileName() {
        return filesFileName;
    }

    public void setFilesFileName(List<String> filesFileName) {
        this.filesFileName = filesFileName;
    }

    public List<String> getFilesContentType() {
        return filesContentType;
    }

    public void setFilesContentType(List<String> filesContentType) {
        this.filesContentType = filesContentType;
    }
}

说明:

  • 定义上传文件列表、文件名列表和文件类型列表三个属性。
  • 实现Action的execute()方法。
  • execute()方法中遍历上传文件列表,并输出文件名、文件类型和文件大小。
  • 为每个属性都提供了getter和setter方法。

4. 在Struts2中配置上传拦截器

最后,我们需要在Struts2中配置文件上传拦截器。

<interceptors>
    <interceptor name="fileUpload"
                 class="org.apache.struts2.interceptor.FileUploadInterceptor" />
    <interceptor-stack name="myStack">
        <interceptor-ref name="fileUpload" />
        <interceptor-ref name="defaultStack" />
    </interceptor-stack>
</interceptors>

<global-results>
    <result name="input">/upload.jsp</result>
    <result name="error">/upload.jsp</result>
</global-results>

<action name="upload"
        class="com.example.actions.UploadAction"
        method="execute">
    <interceptor-ref name="myStack" />
    <result name="success">/success.jsp</result>
    <result name="input">/upload.jsp</result>
    <result name="error">/upload.jsp</result>
</action>

说明:

  • 在配置文件中声明一个名为myStack的自定义拦截器栈,并将文件上传拦截器和默认拦截器栈都引入该拦截器栈中。
  • 在全局结果中定义了inputerror两个结果,当Action返回这些结果时都会跳转到upload.jsp页面。
  • 配置了upload Action,在其中引入myStack拦截器栈,并指定了successinputerror三种返回结果对应的JSP页面。

示例

以下是两条使用JS+Struts2实现多文件上传的示例:

示例一

HTML代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>文件上传示例</title>
</head>
<body>
    <h1>文件上传示例</h1>
    <form enctype="multipart/form-data">
        <input type="file" name="files" multiple>
        <button type="button" onclick="upload()">上传</button>
    </form>

    <script src="upload.js"></script>
</body>
</html>

JavaScript代码:

function upload() {
    var fileInput = document.getElementsByName("files")[0];
    var formData = new FormData();
    for (var i = 0; i < fileInput.files.length; i++) {
        formData.append("files", fileInput.files[i]);
    }

    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4) {
            if (xhr.status == 200) {
                console.log(xhr.responseText);
            } else {
                console.log("上传失败:" + xhr.statusText);
            }
        }
    }

    xhr.open("POST", "/upload");
    xhr.send(formData);
};

Java代码:

public class UploadAction extends ActionSupport {
    private List<File> files;
    private List<String> filesFileName;
    private List<String> filesContentType;

    public String execute() {
        try {
            for (int i = 0; i < files.size(); i++) {
                File file = files.get(i);
                String fileName = filesFileName.get(i);
                String contentType = filesContentType.get(i);
                System.out.println("上传文件:" + fileName + ",类型:" + contentType + ",大小:" + file.length());
            }
        } catch (Exception e) {
            e.printStackTrace();
            return ERROR;
        }

        return SUCCESS;
    }

    public List<File> getFiles() {
        return files;
    }

    public void setFiles(List<File> files) {
        this.files = files;
    }

    public List<String> getFilesFileName() {
        return filesFileName;
    }

    public void setFilesFileName(List<String> filesFileName) {
        this.filesFileName = filesFileName;
    }

    public List<String> getFilesContentType() {
        return filesContentType;
    }

    public void setFilesContentType(List<String> filesContentType) {
        this.filesContentType = filesContentType;
    }
}

示例二

HTML代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>文件上传示例</title>
</head>
<body>
    <h1>文件上传示例</h1>
    <form enctype="multipart/form-data">
        <input type="file" name="files" multiple>
        <button type="submit">上传</button>
    </form>

    <script src="upload.js"></script>
</body>
</html>

JavaScript代码:

var form = document.forms[0];

form.addEventListener("submit", function(event) {
    event.preventDefault();
    upload();
});

function upload() {
    var fileInput = document.getElementsByName("files")[0];
    var formData = new FormData();
    for (var i = 0; i < fileInput.files.length; i++) {
        formData.append("files", fileInput.files[i]);
    }

    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4) {
            if (xhr.status == 200) {
                console.log(xhr.responseText);
            } else {
                console.log("上传失败:" + xhr.statusText);
            }
        }
    }

    xhr.open("POST", "/upload");
    xhr.send(formData);
};

Java代码:

public class UploadAction extends ActionSupport {
    private List<File> files;
    private List<String> filesFileName;
    private List<String> filesContentType;

    public String execute() {
        try {
            for (int i = 0; i < files.size(); i++) {
                File file = files.get(i);
                String fileName = filesFileName.get(i);
                String contentType = filesContentType.get(i);
                System.out.println("上传文件:" + fileName + ",类型:" + contentType + ",大小:" + file.length());
            }
        } catch (Exception e) {
            e.printStackTrace();
            return ERROR;
        }

        return SUCCESS;
    }

    public List<File> getFiles() {
        return files;
    }

    public void setFiles(List<File> files) {
        this.files = files;
    }

    public List<String> getFilesFileName() {
        return filesFileName;
    }

    public void setFilesFileName(List<String> filesFileName) {
        this.filesFileName = filesFileName;
    }

    public List<String> getFilesContentType() {
        return filesContentType;
    }

    public void setFilesContentType(List<String> filesContentType) {
        this.filesContentType = filesContentType;
    }
}

总结

本文讲解了如何使用JavaScript和Struts2框架实现多文件上传功能。使用该方法,我们可以轻松上传多个文件到服务器端,并在Struts2 Action中方便地接收上传文件。如果你需要实现多文件上传功能,不妨一试!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS+Struts2多文件上传实例详解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • maven插件spring-boot-starter-tomcat的使用方式

    Maven是一款非常流行的Java项目构建工具,而Spring Boot则是基于Spring框架的快速应用开发框架。spring-boot-starter-tomcat是Spring Boot中自带的Maven插件,它可以帮助我们快速构建和部署基于Tomcat的Web应用程序。下面是使用spring-boot-starter-tomcat插件的详细攻略。 1…

    Java 2023年5月19日
    00
  • 从零开始使用IDEA创建SpringBoot项目(图文)

    下面是详细的攻略: 1. 安装JDK 在使用IDEA创建SpringBoot项目之前,需要先安装JDK,确保能够正常运行Java程序。可以到Oracle官网下载并安装JDK。安装完成后,可以在终端中输入以下命令检查是否安装成功: java -version 2. 安装IDEA 安装完JDK后,可以下载并安装一个Java开发工具,如:IntelliJ IDEA…

    Java 2023年5月15日
    00
  • Spring Security 实现多种登录方式(常规方式外的邮件、手机验证码登录)

    下面是 Spring Security 实现多种登录方式的完整攻略: 概述 Spring Security 是 Spring 生态中的一个安全框架,它提供了许多安全方面的功能,如认证、授权和攻击防护等。其中认证功能就是判断用户是否合法,并确定用户是否具有相关资源的访问权限。 常规方式的登录是通过用户名和密码进行认证,而本文要讨论的是除常规方式外的邮件、手机验…

    Java 2023年5月20日
    00
  • 用连接池提高Servlet访问数据库的效率(2)

    使用连接池可以有效提高Servlet访问数据库的效率,主要因为连接池可以减少数据库连接的创建和释放所花费的时间,以及避免因为连接未关闭而导致的数据库连接泄露问题。 以下是使用连接池进行Servlet访问数据库的攻略: 1. 导入数据库连接池依赖 使用连接池需要先导入对应的依赖包。常见的数据库连接池有C3P0、Druid等。以C3P0为例,可以使用以下Mave…

    Java 2023年6月15日
    00
  • Java基础之文件和目录操作

    Java基础之文件和目录操作 在Java中,文件和目录操作是很常见的任务。Java提供了一系列的类和方法来实现这些操作。本文将介绍Java中文件和目录的基础操作。 文件基础操作 创建文件 在Java中,使用File类来创建文件。可以通过以下代码创建一个新的文件: File file = new File("example.txt"); t…

    Java 2023年6月1日
    00
  • 实例讲解JSP Model2体系结构(下)

    “实例讲解JSP Model2体系结构(下)”是一篇介绍JSP Model2体系结构的文章,其中涉及了该体系结构的设计思想、实现方法以及使用场景等方面的内容。本文将对该篇文章进行详细的讲解,具体包括以下几个部分: 1. 文章结构 该篇文章分为四个部分,分别是: JSP Model2体系结构概述 JSP Model2实例详解 JSP Model2的优缺点 总结…

    Java 2023年6月15日
    00
  • 教你怎么用JSP统计网站访问人数

    下面我将详细讲解如何使用 JSP 统计网站访问人数的完整攻略。 1. 确定需求和实现方式 首先,我们需要确定我们统计访问人数的具体需求。一般来说,统计网站访问人数可以通过记录网站访问量或者记录独立访客数量来实现。 对于记录网站访问量,一般常用的方式是在网站的每个页面中嵌入一个计数器。当用户访问网站的时候,计数器会自动加一。而对于独立访客数量的记录,则需要在用…

    Java 2023年6月15日
    00
  • SpringBoot整合Kafka工具类的详细代码

    下面是SpringBoot整合Kafka工具类的详细代码攻略。 环境准备 确认已经安装JDK、Maven和Kafka 在Maven中添加Kafka依赖 <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kaf…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部