SpringBoot上传文件如何返回前端进度条

 更新时间:2024年05月30日 10:33:05   作者:是小故事呀  
这篇文章主要介绍了SpringBoot上传文件如何返回前端进度条问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

SpringBoot上传文件返回前端进度条

话不多说,直接上干货

1、需要创建一个实现了processListener接口

的实现类用于监听文件上传进度

import javax.servlet.http.HttpSession;
 
import org.apache.commons.fileupload.ProgressListener;
import org.springframework.stereotype.Component;
 
@Component
public class UploadProgressListener implements ProgressListener {
    private HttpSession session;
 
    public void setSession(HttpSession session){
        this.session=session;
        ProgressEntity status = new ProgressEntity();
        session.setAttribute("status", status);
    }
 
    /* pBytesRead  到目前为止读取文件的比特数
     * pContentLength 文件总大小
     * pItems 目前正在读取第几个文件
     */
    public void update(long pBytesRead, long pContentLength, int pItems) {
        ProgressEntity status = (ProgressEntity) session.getAttribute("status");
        status.setPBytesRead(pBytesRead);
        status.setPContentLength(pContentLength);
        status.setPItems(pItems);
        System.out.println("UploadProgressListener update ProgressEntity:  "+status.toString());
    }
}

2、返回给前端的上传进度的实体类

@Component
public class ProgressEntity {
    // 读取的文件的比特数
    private long pBytesRead = 0L;
    // 文件的总大小
    private long pContentLength = 0L;
    // 目前正在读取第几个文件
    private int pItems;
 
    private long startTime = System.currentTimeMillis();
 
    public ProgressEntity() {
        pBytesRead = 0L;
        pContentLength = 0L;
    }
 
    public long getPBytesRead() {
        return pBytesRead;
    }
 
    public void setPBytesRead(long bytesRead) {
        pBytesRead = bytesRead;
    }
 
    public long getPContentLength() {
        return pContentLength;
    }
 
    public void setPContentLength(long contentLength) {
        pContentLength = contentLength;
    }
 
    public int getPItems() {
        return pItems;
    }
 
    public void setPItems(int items) {
        pItems = items;
    }
 
    @Override
    public String toString() {
        float tmp = (float) pBytesRead;
        float result = tmp / pContentLength * 100;
        return "ProgressEntity [pBytesRead=" + pBytesRead + ", pContentLength="
                + pContentLength + ", percentage=" + result + "% , pItems=" + pItems + "]";
    }
}

3、继承CommonsMultipartResolver类

自定义文件上传处理类

import javax.servlet.http.HttpServletRequest;
 
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.multipart.MultipartException;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
 
public class CustomMultipartResolver extends CommonsMultipartResolver {
 
    @Autowired
    private UploadProgressListener uploadProgressListener;
 
    @Override
    protected MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException {
        String encoding = determineEncoding(request);
        FileUpload fileUpload = prepareFileUpload(encoding);
 
 
        uploadProgressListener.setSession(request.getSession());// 文件上传进度监听器设置session用于存储上传进度
        fileUpload.setProgressListener(uploadProgressListener);// 将文件上传进度监听器加入到 fileUpload 中
        try {
            List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);
            return parseFileItems(fileItems, encoding);
        } catch (FileUploadBase.SizeLimitExceededException ex) {
            throw new MaxUploadSizeExceededException(fileUpload.getSizeMax(), ex);
        } catch (FileUploadBase.FileSizeLimitExceededException ex) {
            throw new MaxUploadSizeExceededException(fileUpload.getFileSizeMax(), ex);
        } catch (FileUploadException ex) {
            throw new MultipartException("Failed to parse multipart servlet request", ex);
        }
    }
}

4、将spring默认的文件上传处理类取消自动配置

并将 multipartResolver 指向我们刚刚创建好的继承 CommonsMultipartResolver 类的自定义文件上传处理类

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartResolver;
 
import com.baidu.doclabel.biz.listener.CustomMultipartResolver;
 
 

@EnableAutoConfiguration
@Configuration
public class UploadProgressApplication {
    @Bean(name = "multipartResolver")
    public MultipartResolver multipartResolver() {
        CustomMultipartResolver customMultipartResolver = new CustomMultipartResolver();
        return customMultipartResolver;
    }
}

至此,SpringBoot上传文件实现进度条代码编写完成,看效果

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java向上转型发生的时机知识点详解

    java向上转型发生的时机知识点详解

    在本篇文章里小编给大家整理分享的是关于java向上转型发生的时机知识点内容,有兴趣的读者们可以参考下。
    2021-05-05
  • Java常见线上故障的排查方案深入剖析

    Java常见线上故障的排查方案深入剖析

    在Java应用的开发和运维过程中,线上问题的出现往往难以避免,这篇文章主要介绍了Java常见线上故障的排查的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-09-09
  • IntelliJ idea报junit no tasks available问题的解决办法

    IntelliJ idea报junit no tasks available问题的解决办法

    这篇文章主要给大家介绍了关于IntelliJ idea报junit no tasks available问题的解决办法,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-11-11
  • Java实现随机出题,10道10以内加减法计算代码实例

    Java实现随机出题,10道10以内加减法计算代码实例

    这篇文章主要介绍了Java实现随机出题,10道10以内加减法计算,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Java Optional实践(小结)

    Java Optional实践(小结)

    这篇文章主要介绍了Java Optional实践(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • Springboot中动态语言groovy介绍

    Springboot中动态语言groovy介绍

    Apache的Groovy是Java平台上设计的面向对象编程语言,这门动态语言拥有类似Python、Ruby和Smalltalk中的一些特性,可以作为Java平台的脚本语言使用,这篇文章主要介绍了springboot中如何使用groovy,需要的朋友可以参考下
    2022-09-09
  • 如何使用两个栈实现队列Java

    如何使用两个栈实现队列Java

    这篇文章主要介绍了如何使用两个栈实现队列Java,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 前端如何调用后端接口进行数据交互详解(axios和SpringBoot)

    前端如何调用后端接口进行数据交互详解(axios和SpringBoot)

    一般来讲前端不会给后端接口,而是后端给前端接口的情况比较普遍,下面这篇文章主要给大家介绍了关于前端如何调用后端接口进行数据交互的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • java 实现取int型的第二个字节的数

    java 实现取int型的第二个字节的数

    这篇文章主要介绍了java 实现取int型的第二个字节的数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java线程池核心参数原理及使用指南

    Java线程池核心参数原理及使用指南

    本文详细介绍了Java线程池的基本概念、核心类、核心参数、工作原理、常见类型以及最佳实践,通过理解每个参数的含义和工作原理,可以更好地配置线程池,提高系统性能,感兴趣的朋友跟随小编一起看看吧
    2025-12-12

最新评论