首页 > 其他分享 >Springboot+React实现Minio文件分片上传、断点续传

Springboot+React实现Minio文件分片上传、断点续传

时间:2024-05-14 12:07:52浏览次数:19  
标签:断点续传 Springboot 文件 前端 React 地址 分片 上传 minio

前言

本文采用前后端结合,后端给前端每个分片的上传临时凭证,前端请求临时url,通过后端间接的去上传分片。其实无关乎 vue 或者 react,思路都是一样的,逻辑也全都是 js 写的,跟模板语法或者 jsx 也没关系,仅仅是赋值不一样而已。

前端:React + TypeScript + Antd + axios + spark-md5 + p-limit + immer
后端:Springboot 3.x + minio + mybatisplus + redis + lombok + hutool-core

前后端的依赖都是最新版。gitee 地址: https://gitee.com/jsonqi/minio-spring-react

前端的 p-limit 是限制请求并发的,不能因为上传文件将请求占满而影响正常业务请求,immer 是为了更方便修改 state 数据,这两个非必须。

为什么不直接前端对接 minio,而要走后端?

  • 直接在前端搭建 minio 环境,如果后端给临时凭证让前端直传,后端是无法感知到文件的存入和变动
  • 大文件是必须要入数据库的,否则秒传是无法实现的。

为什么要给前端每个分片的 url 上传,而不是前端将每个分片给后端,后端存入 minio?

  • 若让前端每个分片都请求后端,后端再将分片传给 minio,势必会造成带宽占用和增大服务器压力
  • 后端生成的分片 url 也是临时凭证 url,可以将时效性尽量降低,来确保文件服务器的安全性。(若对安全性有及其严格的考究另说)

功能点

  • 小文件和大文件信息都会入库,即都过秒传,尽可能减少服务器冗余文件
  • 只有大文件需要分片和合并
  • 进度条展示

功能效果图

展示及请求

image

前端控制台

image

目录结构

image

一个文件的上传,对接后端的请求有三个

  • 点击上传时,请求 <检查文件 md5> 接口,判断文件的状态(已存在、未存在、传输部分)
  • 根据不同的状态,通过 <初始化分片上传地址>,得到该文件的分片地址
  • 前端将分片地址和分片文件一一对应进行上传,这步直接对接 minio
  • 上传完毕,调用 <合并文件> 接口,合并文件,文件数据入库

大文件分片流程

image

整体步骤:

  1. 前端计算文件 md5,并发请求查询此文件的状态
  2. 若文件已上传,则后端直接返回上传成功,并返回 url 地址
  3. 若文件未上传,则前端请求初始化分片接口,返回上传地址。循环将分片文件和分片地址一一对一应
  4. 若文件上传一部分,后端会返回该文件的 uploadId (minio中的文件标识)和 listParts(已上传的分片索引),前端请求初始化分片接口,后端重新生成上传地址。前端循环将已上传的分片过滤掉,未上传的分片和分片地址一一对应。
  5. 前端通过分片地址将分片文件一一上传
  6. 上传完毕后,前端调用合并分片接口
  7. 后端判断该文件是单片还是分片,单片则不走合并,仅信息入库,分片则先合并,再信息入库。删除 redis 中的文件信息,返回文件地址。

该 bucket 开启了公共只读,所以链接地址是可以直接后台拼接的。

标签:断点续传,Springboot,文件,前端,React,地址,分片,上传,minio
From: https://www.cnblogs.com/jsonq/p/18186340

相关文章

  • springboot文件上传下载到本机服务器上
    这次的文件上传下载仅指的是本机的服务器,不指第三方文件存储系统!!!1.在pom中加入以下依赖,如已经加入,请忽略<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <depende......
  • React基于RBAC的权限控制
    简单实现基于RBAC(Role-BasedAccessControl,基于角色的访问控制)的权限控制,可以通过定义角色和权限,然后将权限分配给不同的角色来实现。用户根据其角色获得相应的权限,进而访问特定的路由、页面组件或者操作。以下是在React应用中实现RBAC的一个简单示例。这个示例包括了路由保护......
  • springboot项目启动会报4个加载不到的debug提示,可改可不改
    1.因为启动的时候会报提示:UnabletolocateLocaleResolverwithname'localeResolver':usingdefault[org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver@17162122]有4个这样的--Resolver,(具体每个Resolver在下面注释有说明)要想不报这个加载提示,如果用不......
  • 创建启动springboot项目的一些问题,如spring-boot-autoconfigure 自动加载注入配置
    1.springboot项目启动是否只需要3下面3个jar包<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.b......
  • react native 项目使用 Xcode 打包上架 App Store
    一、创建证书、标识符和描述文件等:1.前提条件可正常运行和打包的代码、Apple开发者账号点击注册Apple开发者账号注册完进入页面可以看到证书、标识符和描述文件创建入口2.创建AppID点击Identifiers旁边的加号选择AppIDs,点击Continue。选择App,点击Conti......
  • 推荐一款Windows兼容的开源操作系统-ReactOS
    ReactOS介绍ReactOS™isanOpenSourceefforttodevelopaqualityoperatingsystemthatiscompatiblewithapplicationsanddriverswrittenfortheMicrosoft®Windows™NTfamilyofoperatingsystems(NT4,2000,XP,2003,Vista,7).TheReactOSproject,al......
  • springboot内嵌tomcat的实现原理
    目录一、tomcat运行原理的简单分析1.1Coyote1.2容器catalina二、用编码的方式启动tomcat一、tomcat运行原理的简单分析tomcat运行时可以简单分成两个大的模块,(1)负责处理socket连接并转换成request对象的部分,连接器Coyote(2)处理用户的请求的容器Catalina下面简单介绍......
  • npm install 报错 ---》npm ERR! request to https://registry.npmjs.org/react faile
    1、npminstall报错E:\wsg\AWC_TEST\stage>npminstallreactreact-domnpmERR!codeCERT_NOT_YET_VALIDnpmERR!errnoCERT_NOT_YET_VALIDnpmERR!requesttohttps://registry.npmjs.org/reactfailed,reason:certificateisnotyetvalidnpmERR!Acomplete......
  • Springboot自动配置原理
    在SpringBoot项目中的引导类上有一个注解@SpringBootApplication,这个注解是对三个注解进行了封装,分别是:@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan其中@EnableAutoConfiguration是实现自动化配置的核心注解。该注解通过@Import注解导入对应的配......
  • SpringBoot速记
    本篇以SpringBoot快速构建一个基础项目,在构建的同时记录相关的知识。常见的架构图: 其中,config中可以引入第三方的jar包controller中存放控制类一个简单的例子如下: mapper中存放对数据库的操作接口 pojo中是实体对象类,常与数据表对应 service中存放服务类:......