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

news/2024/9/22 23:35:36

前言

本文采用前后端结合,后端给前端每个分片的上传临时凭证,前端请求临时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 开启了公共只读,所以链接地址是可以直接后台拼接的。如何开启公共只读,可参考文章:https://www.cnblogs.com/jsonq/p/18157235

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/31351.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

P6577 【模板】二分图最大权完美匹配 (KM)

$\quad $ 初看就发现不对劲了,模板紫题,一看就不简单,就交了个裸\(KM\),哎,果然\(T\)了。$\quad $ 然后就是大力卡常(当然\(O(n^4)\))的复杂度不是卡常能解决的。遂看题解,发现一个据说\(O(n^3)\)的复杂度的\(KM\),也是非常抽象。 具体解释详见 https://www.luogu.com…

传说中的运维门户设计

在IT服务管理这片广阔天地中,运维门户如同一位技艺高超的魔术师,轻轻一挥手,便将纷繁复杂的运维世界化繁为简,编织成一张便捷高效、触手可及的网络。它不仅是ITSM系统中不可或缺的一环,更是连接用户与技术世界的桥梁,让服务触达变得像呼吸一样自然。 运维门户,这个听起来…

中电金信:专题报告商业银行对公数字化转型体系架构及实践拆解

当今,数字化转型已然成为商业银行发展的关键动力,在这个数字时代,对公业务数字化转型更是势在必行。基于此,中电金信发布《商业银行对公数字化转型专题报告》(简称《报告》),针对对公数字化转型进行了专题研究。报告对主要商业银行对公数字化转型进行了深入的业务调研和…

「网络流浅谈」最大流的应用

讲解了最大流的多种模型,从二分图匹配到拆点技巧,带你参观最大流的神秘。二分图匹配 考虑如何将二分图匹配问题,转化为流网络。设置 \(1\) 个汇点和源点,从源点向二分图一侧的每一个点连边,从另一侧向汇点连边,边权均为 \(1\),二分图中的边也全部加入,权值设为 \(1\)。…

单元测试

实验项目名称:实验四 单元测试2一、 实验目的 1、 掌握单元测试技术,并按单元测试的要求设计测试用例。  2、 掌握一种单元测试工具的使用。 二、 实验内容 自行学习C#或python或C++的其中一种单元测试工具的使用,自选一段单元代码(不少于15行),进行测试。完成实验报告…

同一个函数/不同函数的接口关联

第一种:在同一个方法中接口关联,可以直接提取后引用第二种:在不同方法中,声明全局变量,提取后引用第三种:通过在conftest.py文件中定义一个夹具,在测试用例函数中使用这个夹具 # 定义一个登录成功后获取token的夹具 @pytest.fixture(scope="session") def log…

windows 安装Nginx服务

一、版本说明Nginx版本:1.26.0 二、下载Nginx下载地址:https://nginx.org/en/download.html选择一个版本,这里选择最新稳定版本下载后解压到一个目录,注意解压目录最好不要有中文、空格因为电脑只有一个C盘所以地址在C盘,可以选择自己习惯的安装位置 三、下载winsw下载地…

统计力学中的概率论基础(一)

本文的主要内容是一些统计力学中的基础的概率论知识,如密度函数、分布函数和贝叶斯定理的一些基本概念,主要作为一个简单的知识内容记录和分享,后续还有更多的同系列文章。技术背景 统计力学是一门通过粒子的纯粹微观量来表示系统宏观量的学科,从统计分布出发,用无偏/有偏…