大文件断点续传以及进度条的实现方案

大家好,我是小趴菜,文件上传在我们工作中算是一个经常会遇到的一个需求。最常见的做法是直接将整个文件上传,然后由后端进行保存。最后返回一个响应状态码给前端。

问题就是如果用户上传一个很大的文件,这时候上传到一半失败了,那么用户就只能重新上传,这时候用户估计都要开始骂人了。

最好是上传失败了,下次上传就从上次失败的开始,这样就不用重新上传了,所以整体流程如下

断点续传

这时候我们数据库存储的就是如下格式

  • 文件地址:每一个被拆分的小文件的存储地址
  • 文件序列号:这是第几个文件
  • 总文件数量:这个文件被拆分成几个小文件
  • 文件唯一标识:就是给整个大文件生成的唯一标识
js 复制代码
 id        文件唯一标识      文件序列号      文件地址       总文件数量
 1             xpc              1          www.xxx           5
 2             xpc              2          www.xxx           5
 3             xpc              3          www.xxx           5
 4             xpc              4          www.xxx           5
 5             xpc              5          www.xxx           5

那么我们就可以通过这张表得知我们的文件是否都上传了完成了,上传完成以后,我们要做的就是对文件的合并,在对文件进行合并的时候,合并的顺序要与上传的顺序一致,否则合并后的文件就会与原文件不符,这也是为什么要在表里设置一个文件序列号的原因

假设说我们上传第三个小文件失败了,这时候重新上传,重新上传的时候我们让前端传一个文件的唯一标识过来,我们到表里查看一下之前是否上传过,比如说这里上传第三个文件失败了,但是前面二个小文件是上传成功了的。这时候我们可以查到前面二个小文件已经上传成功了,这时候就可以告诉前端,直接从第三个小文件开始上传即可,前面二个小文件就不用上传了

断点续传是完成了,但是用户想知道我此时上传的进度如何,这时候又改怎么做呢?

进度条展示

其实实现起来很简单,我们是可以拿到总的小文件数量以及此时上传的小文件的序号的对吧,比如你一个100MB的文件我分成5个小文件。这时候上传到第三个,上传成功之后,这时候我们用这个小文件的序列号跟小文件总数量相除不就可以得到一个上传百分比的数了嘛

这时候上传的百分比数据是可以得到了,但是前端又该怎么拿到呢?

实现一

我们拿到这个百分比数据之后,以文件唯一标识为key,百分比数据为value,存到redis中,让前端轮询去查

实现二

我们每次上传一个小文件成功以后,都会返回响应给前端的,这时候可以把这个百分比数据携带在响应体中,一起传给前端。

相关推荐
Mr -老鬼10 小时前
Rust适合干什么?为什么需要Rust?
开发语言·后端·rust
123445210 小时前
Agent入门实战-一个题目生成Agent
人工智能·后端
IT_陈寒10 小时前
Java性能调优实战:5个被低估却提升30%效率的JVM参数
前端·人工智能·后端
快手技术10 小时前
AAAI 2026|全面发力!快手斩获 3 篇 Oral,12 篇论文入选!
前端·后端·算法
UrbanJazzerati10 小时前
统计学的"测谎仪":一文搞懂方差、标准差与“N-1”的秘密
面试
颜酱10 小时前
前端算法必备:滑动窗口从入门到很熟练(最长/最短/计数三大类型)
前端·后端·算法
8***f39510 小时前
Spring容器初始化扩展点:ApplicationContextInitializer
java·后端·spring
用户2986985301410 小时前
C#: 如何自动化创建Word可填写表单,告别手动填写时代
后端·c#·.net
顾林海10 小时前
Android文件系统安全与权限控制:给应用数据上把“安全锁”
android·面试·操作系统
青莲84310 小时前
Android 动画机制完整详解
android·前端·面试