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

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

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

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

断点续传

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

  • 文件地址:每一个被拆分的小文件的存储地址
  • 文件序列号:这是第几个文件
  • 总文件数量:这个文件被拆分成几个小文件
  • 文件唯一标识:就是给整个大文件生成的唯一标识
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中,让前端轮询去查

实现二

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

相关推荐
copyer_xyf5 小时前
Python 异常处理
前端·后端·python
llz_1126 小时前
web-第三次课后作业
前端·后端·web
MageGojo8 小时前
天气 API 接入实战:基于 ApiZero 实现实时天气、分钟级降水和 15 天预报查询
java·后端·spring·api 接口接入·接口实战
代码小库8 小时前
免费制作简历 + 免费简历押题
面试
Aphasia3119 小时前
手写KeepAlive组件
前端·react.js·面试
牛客企业服务9 小时前
2026人才选拔新基准:AI能力考核如何重构企业招聘竞争力?
面试·ai面试·ai能力·ai coding·ai能力考核
pe7er9 小时前
软件设计不要“既要又要”
前端·后端·架构
柏舟飞流9 小时前
Spring Boot 深入实践指南:从入门到工程化落地
spring boot·后端·firefox
IT_陈寒10 小时前
Java Stream并行流的坑:我花了3小时才找到的线程安全问题
前端·人工智能·后端
Raink老师10 小时前
【AI面试临阵磨枪-94】Skill 安全:注入、越权、数据泄露、恶意代码、沙箱?
数据库·安全·面试