Struts2实现文件上传时显示进度条功能

yizhihongxing

请看下面的详细讲解:

1. 背景和思路

Java Web开发中,文件上传功能是一个非常常见而且常用的功能,而文件上传时的进度条功能可以让用户更加直观地看到上传的进程和速度,大大提升了用户体验。

在Struts2框架中,想要实现文件上传并显示进度条功能,通常需要借助第三方插件或者库。该攻略介绍一种基于apache.commons包中的FileUpload组件实现Struts2文件上传进度条功能的方法。

具体思路如下:

  1. 通过FileUpload组件实现文件上传
  2. 监听文件上传过程中产生的进度事件
  3. 将上传进度信息通过异步请求的方式返回给前端,前端通过Ajax响应显示出进度条

2. 解决方案

2.1 导入依赖包

首先需要导入以下依赖包:

<!-- Struts2核心包 -->
<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-core</artifactId>
    <version>2.5.22</version>
</dependency>
<!-- Apache.commons文件上传组件 -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>

2.2 编写Action类

在Action类中,需要定义一个可以返回当前文件上传进度信息的方法,可以通过使用com.opensymphony.xwork2.ActionSupport类的inputStream属性,将上传进度使用输出流(OutputStream)的方式输出。

下面是一个简单的示例:

public class UploadAction extends ActionSupport {

    private File file;
    private String fileContentType;
    private String fileFileName;
    // 定义一个输入流来接收上传进度信息
    private InputStream inputStream;

    // 省略getter和setter

    // 定义一个方法,返回当前文件上传进度信息
    public InputStream getInputStream() {
        return inputStream;
    }

    public String execute() throws Exception{
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpServletResponse response = ServletActionContext.getResponse();
        // 设定相应的编码格式,避免中文乱码问题
        response.setContentType("text/html;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");

        // 通过FileUpload组件实现文件上传
        DiskFileItemFactory factory = new DiskFileItemFactory();
        File tempFile = new File("I:\\temp");
        factory.setRepository(tempFile);
        ServletFileUpload upload = new ServletFileUpload(factory);
        // 监听文件上传过程中产生的进度事件
        ProgressListener progressListener = new ProgressListenerImpl(response);
        upload.setProgressListener(progressListener);
        List<FileItem> items = upload.parseRequest(request);
        for(FileItem item : items) {
            if(item.isFormField()){

            } else {
                // 解决文件上传中文乱码问题
                String fileName = item.getName();
                fileName = new String(fileName.getBytes("GBK"),"UTF-8");
                // 输出文件上传进度信息
                String result = "{\"code\":0,\"msg\":\"\"upload success!\"}";
                inputStream = new ByteArrayInputStream(result.getBytes(StandardCharsets.UTF_8));
                item.write(new File(uploadPath + fileName));
            }
        }
        return SUCCESS;
    }
}

需要注意的是,这里我们需要通过ProgressListener监听器实时获取文件上传的进度信息,并将该信息通过输出流(OutputStream)的方式返回给前端。

ProgressListenerImpl类的示例如下:

public class ProgressListenerImpl implements ProgressListener {

    private HttpServletResponse response;

    public ProgressListenerImpl(HttpServletResponse response) {
        super();
        this.response = response;
    }

    // 文件上传进度监控
    @Override
    public void update(long pBytesRead, long pContentLength, int pItems) {
        if(pBytesRead == pContentLength){
            return;
        }
        HttpSession httpSession = ServletActionContext.getRequest().getSession();
        long percent = pBytesRead * 100 / pContentLength;

        if(httpSession.getAttribute("pBytesRead") == null || (long)httpSession.getAttribute("pBytesRead") != pBytesRead){
            httpSession.setAttribute("pBytesRead", pBytesRead);
            try {
                response.getWriter().println(percent);
                response.getWriter().flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        if(percent == 100){
            httpSession.removeAttribute("pBytesRead");
        }
    }
}

2.3 编写前端页面

前端页面需要通过Ajax的方式,调用后台Action类定义的传输进度的方法,并利用jQuery实现异步请求,实时更新进度条显示状态。

下面是一个简单的示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Struts2文件上传进度条功能</title>
    <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
    <script>
        $(document).ready(function() {
            var timer;
            $("#upload-button").click(function(){
                // 利用Ajax调用后台Action类定义的传输进度的方法
                $.ajax({
                    type : "get",
                    url : "upload!progress.action",
                    dataType : "text",
                    cache : false,
                    complete: function(result){
                        $(".progress-bar").text(result.responseText + "%");
                        $(".progress-bar").width(result.responseText + "%");
                        if(result.responseText == 100){
                            clearInterval(timer);
                            alert("文件上传成功!");
                        }
                    }
                });
            });
        });
    </script>
    <style>
        body {
            margin: 20px auto;
        }
        .progress {
            width: 60%;
            margin: 50px auto;
        }
        .progress-bar {
            float: left;
            width: 0%;
            height: 2rem;
            font-size: 1.5rem;
            line-height: 2rem;
            color: #fff;
            text-align: center;
            background-color: #007bff;
            transition: width .6s ease;
        }
    </style>
</head>
<body>
<div class="progress">
    <div class="progress-bar" role="progressbar" aria-valuemin="0" aria-valuemax="100">
        0%
    </div>
</div>
<button id="upload-button">上传文件</button>
</body>
</html>

3. 示范演示

为了更加清晰地展示Struts2实现文件上传时显示进度条的功能,下面提供两个规范的示例供您参考:

3.1 示例一

步骤如下:

  1. 新建一个名为commons-fileupload-demo的Maven工程
  2. 在pom.xml文件中加入依赖包的声明
  3. 在src/main/java目录下创建一个名为com.commons.fileupload的包,并在该包中创建一个名为UploadAction的Action类
  4. 在src/main/webapp目录下创建一个名为index.jsp的文件,作为前端页面
  5. 在resources文件夹下创建一个名为struts.xml的配置文件,配置上传文件允许的大小和上传文件的保存路径
  6. 启动Tomcat服务器并运行,并通过浏览器打开上传文件的页面
  7. 选择要上传的文件,点击“上传”按钮,即可上传,并实时在前端页面显示出上传进度的变化

关于该示例的代码,可以访问GitHub链接进行查看和下载。

3.2 示例二

步骤如下:

  1. 新建一个名为struts2-fileupload-demo的Maven工程
  2. 在pom.xml文件中加入依赖包的声明
  3. 在src/main/java目录下创建一个名为com.struts2.fileupload的包,并在该包中创建一个名为UploadAction的Action类
  4. 在src/main/webapp目录下创建一个名为index.jsp的文件,作为前端页面
  5. 在resources文件夹下创建一个名为struts.xml的配置文件,配置上传文件允许的大小和上传文件的保存路径
  6. 在src/main/webapp目录下创建一个名为struts.xml的配置文件,配置Struts2的过滤器拦截器等信息
  7. 启动Tomcat服务器并运行,并通过浏览器打开上传文件的页面
  8. 选择要上传的文件,点击“上传”按钮,即可上传,并实时在前端页面显示出上传进度的变化

关于该示例的代码,可以访问GitHub链接进行查看和下载。

以上就是本攻略对于Struts2实现文件上传时显示进度条的完整讲解,希望能够对您有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Struts2实现文件上传时显示进度条功能 - Python技术站

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

相关文章

  • 详解如何在Spring Security中自定义权限表达式

    在对Spring Security中自定义权限表达式的攻略之前,先简单介绍一下权限表达式的作用: Spring Security中的权限表达式用于在方法调用或请求访问时,判断当前用户是否具有访问权限。Spring Security提供了很多默认的权限表达式,例如”hasRole()”和”hasAnyRole()”等。但是,我们有时需要根据不同的业务需求来自定…

    Java 2023年5月20日
    00
  • Java Swing实现记事本页面

    Java Swing是Java平台下的一个GUI工具包,可以轻松实现桌面应用程序。要实现Java Swing记事本页面,可以参考以下完整攻略: 第一步:创建Swing应用程序 创建一个Java Swing应用程序,这可以通过在Java开发环境中选择“新建”->“项目”->“Java”->“Swing应用程序”开始。生成的新项目将包含一个My…

    Java 2023年5月19日
    00
  • SpringBoot封装响应数据实现过程详解

    关于“SpringBoot封装响应数据实现过程详解”的攻略,我会提供以下内容: 1. 什么是SpringBoot封装响应数据? 在SpringBoot中,我们常常需要对返回的数据进行封装,以便更好地统一数据格式、处理异常、方便前端进行渲染等等。而SpringBoot提供了多种方式来实现对响应数据的封装,本文将会介绍其中一种比较常见的方式。 2. 四步实现封装…

    Java 2023年5月20日
    00
  • Java下SpringBoot创建定时任务详解

    下面我将为您详细讲解“Java下SpringBoot创建定时任务详解”的完整攻略。 SpringBoot定时任务详解 什么是定时任务 定时任务指定在特定的时间段执行的一种操作,比如每天凌晨1点执行一次数据库备份操作、每分钟执行一次数据同步操作等。在开发中,经常使用定时任务来完成一些需要定期执行的任务。 SpringBoot中创建定时任务 SpringBoot…

    Java 2023年5月19日
    00
  • SpringBoot 整合Jest实例代码讲解

    让我们开始讲解“SpringBoot 整合Jest实例代码讲解”的完整攻略。 1. 简介 Jest是一个基于Java的全文搜索引擎库,具有快速、可扩展和易于使用的特点。而Spring Boot是目前非常流行的一款Java Web框架,其提供了开箱即用的特性,可以快速搭建Web应用程序。 在本文中,我们将介绍如何使用Spring Boot整合Jest,并提供两…

    Java 2023年5月26日
    00
  • Ajax添加数据与删除篇实现代码

    下面详细讲解“Ajax添加数据与删除篇实现代码”的完整攻略。 一、准备工作 在正式开始编写Ajax添加数据与删除篇的实现代码前,需要先完成以下准备工作: 确保你已经学习过Ajax基础知识,包括Ajax的基本流程、请求方式、回调函数等等。 确定添加数据与删除篇功能需要操作的数据表格,包括表格名称、字段名称等等。 熟悉服务器端处理Ajax请求的技术,例如PHP、…

    Java 2023年6月15日
    00
  • 关于Spring Cloud 本地属性覆盖的问题

    Spring Cloud 配置中心提供了一种方便的方式来管理应用程序的配置。但是,当在本地的配置文件中设置了属性值时,我们可能会遇到Spring Cloud本地属性覆盖的问题。下面我们将讲解如何解决这个问题。 问题描述 在使用Spring Cloud Config作为配置中心时,如果我们在本地的配置文件中定义了一些属性,那么这些属性就会将从Spring Cl…

    Java 2023年5月20日
    00
  • Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

    针对Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析的完整攻略,可以按照以下步骤进行: 1. 确定研究目标 首先需要明确研究目标,即了解在Android系统中,进程间通信的机制及其具体实现方式。这里主要研究Binder机制在应用程序框架层的Java接口源代码分析。 2. 学习Binder机制原理 接下来需要学习Binder…

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