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

请看下面的详细讲解:

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日

相关文章

  • Java中字符串与byte数组之间的相互转换

    Java中字符串与byte数组之间的相互转换是经常使用的操作,下面是完整攻略: 字符串转byte数组 将字符串转换为byte数组可以通过以下两种方式实现: 1.使用String类的getBytes()方法 String str = "hello, world!"; byte[] bytes = str.getBytes(); 这里的get…

    Java 2023年5月26日
    00
  • JDK1.6集合框架bug 6260652解析

    JDK1.6集合框架bug 6260652解析 问题描述 JDK1.6版本的集合框架中存在一个bug,编号为6260652。该问题存在于java.util.HashMap和java.util.HashSet等集合类中的迭代器实现中。当在迭代过程中,同时修改集合中的元素,或更改元素hashCode值导致迭代器自动校验失败时,就会引发ConcurrentModi…

    Java 2023年5月27日
    00
  • Spring Boot2深入分析解决java.lang.ArrayStoreException异常

    Spring Boot2深入分析解决java.lang.ArrayStoreException异常 问题描述 如果在Spring Boot中使用JPA,而你的数据实体类中有一个数组类型的属性,那么在运行时可能会遇到以下错误: java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresen…

    Java 2023年6月2日
    00
  • 页面的缓存与不缓存设置及html页面中meta的作用

    页面缓存是浏览器缓存方式之一,也是提高网站性能的重要手段之一。Web页面中通过使用HTTP头,让浏览器在本地缓存页面,以避免重复网络请求。本文将对页面缓存和不缓存设置进行详细讲解,并介绍HTML页面中meta标签的作用。 页面缓存的作用 页面缓存是将网站的静态资源如CSS、JS、图片等文件保存在本地,下次打开同样的页面,在一段时间内可以直接从缓存中读取,从而…

    Java 2023年6月16日
    00
  • MyBatis-Plus自定义通用的方法实现

    “MyBatis-Plus自定义通用的方法实现”是指自定义一些通用的方法,增加MyBatis-Plus的功能,在使用过程中能够更加方便、高效。下面详细讲解如何实现自定义通用方法。 一、自定义IService接口 MyBatis-Plus提供了一个IService接口作为服务层的基础接口,我们可以通过自定义IService接口来实现自己的通用方法。首先要创建一…

    Java 2023年5月20日
    00
  • Springboot整合策略模式详解

    Spring Boot整合策略模式详解 策略模式是一种常用的设计模式,它可以帮助我们在运行时选择不同的算法或行为。在本文中,我们将详细讲解如何在Spring Boot中使用策略模式,并提供两个示例来演示如何使用策略模式。 策略模式简介 策略模式是一种行为型设计模式,它定义了一系列算法或行为,并将它们封装在独立的类中,使得它们可以相互替换。策略模式可以帮助我们…

    Java 2023年5月15日
    00
  • 如何实现 Java SpringBoot 自动验证入参数据的有效性

    Java SpringBoot 通过javax.validation.constraints下的注解,实现入参数据自动验证如果碰到 @NotEmpty 否则不生效,注意看下 @RequestBody 前面是否加上了@Valid Validation常用注解汇总 Constraint 详细信息 @Null 被注释的元素必须为 null @NotNull 被注释…

    Java 2023年4月18日
    00
  • Java正则表达式API Matcher类方法

    接下来我会为你详细讲解Java正则表达式API Matcher类方法的完整攻略。 什么是Java正则表达式? Java正则表达式是一种文本模式,用于匹配文本中的字符序列。它们通常用于搜索、替换和验证字符串。Java正则表达式由Pattern类表示,它有一个compile()方法,用于将正则表达式编译为一个Pattern对象。Matcher类提供了对字符串的匹…

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