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日

相关文章

  • sqlite数据库的介绍与java操作sqlite的实例讲解

    SQLite数据库介绍 SQLite是一款轻量级、自包含的数据库引擎。它可以跨平台运行,同时保持了一致的API,使得它易于在多个平台下使用。它以简单、易用、可靠、高效等特点俘获了众多开发者的心。下面介绍一下如何在Java中操作SQLite。 Java操作SQLite的实例 环境准备 在开始之前,您需要先下载和安装SQLite的JDBC驱动。您可以从SQLit…

    Java 2023年5月19日
    00
  • echarts整合多个类似option的方法实例

    下面我将为您详细讲解“echarts整合多个类似option的方法实例”的完整攻略,主要分为以下几步进行。 1. 确认需求 在开始实现之前,我们首先需要确认我们的需求是什么。假设我们需要实现一个折线图,我们希望可以通过选择不同的时间段,动态的显示不同的数据,例如按天、按周、按月等显示数据。 2. 构建数据 为了实现我们的需求,我们需要构建一个数据对象,来保存…

    Java 2023年6月15日
    00
  • java编程进行动态编译加载代码分享

    一、介绍 动态编译加载(Dynamic Compilation and Loading)是指在运行时将Java源代码进行编译,并将编译后的字节码装载到JVM中,从而实现动态加载代码的效果。这种技术常用于实现插件机制、动态配置等场景。 本文将介绍如何使用Java编程进行动态编译加载代码分享,在介绍具体的实现过程之前,我们先来了解一下Java提供的相关工具和AP…

    Java 2023年5月30日
    00
  • JAVA实现较完善的布隆过滤器的示例代码

    Java实现较完善的布隆过滤器需要遵循以下步骤: 步骤一:引入Maven依赖 引入以下Maven依赖: <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>30.…

    Java 2023年5月23日
    00
  • SpringBoot整合MyBatis的代码详解

    以下是关于SpringBoot整合MyBatis的完整攻略: 1. 准备工作 建立SpringBoot项目 添加相关依赖:SpringBoot的Web、MyBatis、MySQL驱动 2. 配置数据源 在SpringBoot项目的配置文件application.properties中,添加数据源的相关配置: # 数据源配置 spring.datasource…

    Java 2023年5月19日
    00
  • Java实现简单聊天机器人

    让我来讲解一下怎么用Java实现简单聊天机器人的攻略。 1. 确定需求 在实现之前,首先需要明确聊天机器人的需求是什么。需要考虑的问题包括:聊天机器人的功能,需要处理哪些类型的输入和输出,需要哪些外部依赖等。 我们这里实现一个基本的聊天机器人,它能够对用户的输入进行解析并返回对应的回复。具体实现过程中,输入包括文本、语音、图片等类型;输出也包括文本、语音、图…

    Java 2023年5月19日
    00
  • Java:String.split()特殊字符处理操作

    Java中的String类提供了split()方法,用于将一个字符串按照指定的分隔符拆分成多个子字符串。在使用split()方法时,可以使用正则表达式作为分隔符,对有些特殊字符需要进行特殊处理,本文将讲解如何处理这些特殊字符的方法。 1. 特殊字符处理方法 下面是特殊字符的处理方法,我们需要将这些字符转义,使其能够正确地被split()方法识别。 “.”:表…

    Java 2023年5月27日
    00
  • Java常用类之日期相关类使用详解

    Java常用类之日期相关类使用详解 Java提供了很多日期相关的类,包括日期、时间、日期时间、时间戳等类型,本文将对这些类的使用进行详解,方便大家在Java开发中更加灵活、方便的操作日期。 Date类 java.util.Date类是Java日期相关类的源头,代表着一个精确到毫秒级别的时间戳。但是,它已经过时不建议使用了。我们现在推荐使用java.time包…

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