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

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

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

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

断点续传

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

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

实现二

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

相关推荐
p***199417 小时前
SpringBoot项目中替换指定版本的tomcat
spring boot·后端·tomcat
知识即是力量ol17 小时前
口语八股:Redis 面试实战指南——基础篇、持久化篇
数据库·redis·面试·八股
古城小栈17 小时前
Rust中 引用类型 VS 裸指针
开发语言·后端·rust
Victor35618 小时前
MongoDB(12)如何启动和停止MongoDB服务?
后端
uzong18 小时前
老板说“哪里上不了?”——项目排期谈不拢?你缺的不是理由,是弹药
后端
Victor35618 小时前
MongoDB(13)如何配置MongoDB的存储路径?
后端
苍何1 天前
即梦Seedance2.0海外火爆出圈,AI 视频的 DeepSeek 时刻来了!(附实测教程)
后端
苍何1 天前
阿里卷麻了,千问 Qwen-Image-2.0 发布,超强文字渲染、信息图、PPT 轻松做(附实测提示词)
后端
苍何1 天前
被马斯克疯狂点赞的国产 AI,很可能是 AI 时代的抖音!
后端
苍何1 天前
国产Windows 版 Claude Cowork 来了,内置海量 Skills,绝了。
后端