springboot+layui实现带进度条带参数上传

2024-08-22 20:38

本文主要是介绍springboot+layui实现带进度条带参数上传,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

直接进入主题

layui有很多很好用的组件给我们使用,这里前端使用layui提供的进度条组件

后端使用springboot监听传入的byte,然后返回给前端,最终实现进度条功能

layui官网  https://www.layui.com/

springboot官网  http://spring.io/projects/spring-boot

 

1.后端

首先定义一个进程的实体类,关于进度条的数据在这里定义

package com.yuxiao.springboot.upload.entity;import org.springframework.stereotype.Component;/*** 上传进度实体类*/
@Component
public class ProgressEntity {private long readBytes = 0L; //到目前为止读取文件的比特数private long allBytes = 0L;    //文件总大小private int currentIndex;      //目前正在读取第几个文件public long getReadBytes() {return readBytes;}public void setReadBytes(long readBytes) {this.readBytes = readBytes;}public long getAllBytes() {return allBytes;}public void setAllBytes(long allBytes) {this.allBytes = allBytes;}public int getCurrentIndex() {return currentIndex;}public void setCurrentIndex(int currentIndex) {this.currentIndex = currentIndex;}@Overridepublic String toString() {return "ProgressEntity{" +"readBytes=" + readBytes +", allBytes=" + allBytes +", currentIndex=" + currentIndex +'}';}
}

然后定义一个listener来监听上传文件的相关信息,总大小,已读取的文件等等

package com.yuxiao.springboot.upload.listener;import com.yuxiao.springboot.upload.entity.ProgressEntity;
import org.apache.commons.fileupload.ProgressListener;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpSession;@Component
public class UploadProgressListener implements ProgressListener {private HttpSession session;public void setSession(HttpSession session){this.session = session;ProgressEntity pe = new ProgressEntity();session.setAttribute("uploadStatus", pe);}/***  设置当前已读取文件的进度* @param readBytes 已读的文件大小(单位byte)* @param allBytes 文件总大小(单位byte)* @param index 正在读取的文件序列*/@Overridepublic void update(long readBytes, long allBytes, int index) {ProgressEntity pe = (ProgressEntity) session.getAttribute("uploadStatus");pe.setReadBytes(readBytes);pe.setAllBytes(allBytes);pe.setCurrentIndex(index);}
}

再定义一个配置类,yua源源不断的把进度信息放到session中

package com.yuxiao.springboot.upload.config;import com.yuxiao.springboot.upload.listener.UploadProgressListener;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartException;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;import javax.servlet.http.HttpServletRequest;
import java.util.List;@Component
public class YuxiaoMultipartResolver extends CommonsMultipartResolver {@Autowiredprivate UploadProgressListener progressListener;@Overrideprotected MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException {String encoding = super.determineEncoding(request);progressListener.setSession(request.getSession());FileUpload fileUpload = prepareFileUpload(encoding);fileUpload.setProgressListener(progressListener);try {List<FileItem> fileItemList =  ((ServletFileUpload)fileUpload).parseRequest(request);return super.parseFileItems(fileItemList, encoding);} catch (FileUploadException e) {e.printStackTrace();}return null;}
}

最后写控制层,在点击文件上传之后,需要不断访问获得经度

package com.yuxiao.springboot.upload.controller;import com.yuxiao.springboot.upload.entity.ProgressEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;/*** 文件上传及进度测试*/
@Controller
public class UploadController {/*** 显示文件上传页* @return*/@RequestMapping("uploadPage")public String showUploadPage(){return "uploadPage";}/** 文件上传* <p>Title: upload</p>  * <p>Description: </p>  * @param file* @return*/@PostMapping("upload")@ResponseBodypublic Map<String, Object> upload(MultipartFile file){Map<String, Object> result = new HashMap<>();if (file != null && !file.isEmpty()){try {file.transferTo(new File("d:/"+file.getOriginalFilename()));result.put("code", 200);result.put("msg", "success");} catch (IOException e) {result.put("code", -1);result.put("msg", "文件上传出错,请重新上传!");e.printStackTrace();}} else {result.put("code", -1);result.put("msg", "未获取到有效的文件信息,请重新上传!");}return result;}/*** 获取文件上传进度* @param request* @return*/@RequestMapping("getUploadProgress")@ResponseBodypublic ProgressEntity getUploadProgress(HttpServletRequest request){return (ProgressEntity) request.getSession().getAttribute("uploadStatus");}}

 

 

最后是前端页面 elem是上传的文件,bindAction是触发按钮  url是后端接口地址,data可以设置上传携带参数,progress:function中就可以获得上传进度。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>文件上传</title><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><link rel="stylesheet" href="/plugins/layui-v2.2.5/css/layui.css" media="all"><script src="/plugins/layui-v2.2.5/layui.js"></script>
</head>
<body><!--<input type="hidden" id="scopeType" name="scopeType" value="1">-->
<!--<input type="hidden" id="scopeId" name="scopeId" value="5">-->
<!--<input type="hidden" id="appCatagory" name="appCatagory" value="1">--><button type="button" class="layui-btn" id="addFile"><i class="layui-icon">&#xe67c;</i>添加文件
</button><button type="button" class="layui-btn" id="upload">上传</button>
<div class="layui-progress layui-progress-big" lay-showpercent="true" lay-filter="uploadProgressBar"><div class="layui-progress-bar" lay-percent="0%"></div>
</div>
</body>
<script>layui.use(["layer","form", "upload","jquery","element"], function () {// 注意:为了动态显示进度条,必须加载element组件var layer = layui.layer, upload = layui.upload, $ = layui.jquery, element = layui.element;upload.render({accept : "file",elem : "#addFile",auto : false,   //关闭文件自动上传bindAction : "#upload", //文件上传触发按钮url : "upload",data:{scopeType:  1,scopeId:  5,appCatagory:  1},//设置上传时携带的参数,后端可以用 String appCatagory = request.getParameter("appCatagory");接收progress:function(value){//上传进度回调 value进度值element.progress('uploadProgressBar', value+'%')//设置页面进度条},before : function (obj) {/* var intId = setInterval(function () {getUploadStatus(intId);}, 1000); //每秒向服务端获取一次当前上传进度情况*/},done : function (res, index, upload) {// if(res.code != 200){//     layer.open({//         icon : 2,//         skin : "layui-layer-molv",//         content : res.msg//     });// }console.log(res);},error : function (res) {}});});
</script>
</html>

实现效果

 

 

 

最后附上源码  https://github.com/Yanyf765/upload

这篇关于springboot+layui实现带进度条带参数上传的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1097342

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三