分片上传

为什么需要分片上传

如果文件体积比较大,或者网络条件不好时,上传的时间会比较长(要传输更多的报文,丢包重传的概率也更大),用户不能刷新页面,只能耐心等待请求完成。

分片上传的核心思想

利用H5提供的原生File对象,由于File对象是特殊类型的Blob, File接口也继承了Blob接口的属性,分片上传的核心思想就是利用File继承Blob接口的Blob.slice方法。

Blob.slice方法可以将我们的文件切分为多个单个的切片,分片上传的思想就是利用slice APi将文件分割成多个切片,然后利用浏览器多进程的特性进行并发上传。

为了后端能正确的拼接文件,我们需要为每一个文件提供一个唯一的标识符,以及标记每一个切片的顺序。

标识符一般通过以下两种方式获取

根据文件名、文件长度等基本信息进行拼接,为了避免多个用户上传相同的文件,可以再额外拼接用户信息如uid等保证唯一性。

根据文件的二进制内容计算文件的hash,这样只要文件内容不一样,则标识也会不一样,缺点在于计算量比较大。

document.getElementById('file').addEventListener('change', function () {var blobSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice,file = this.files[0],chunkSize = 2097152,                             // Read in chunks of 2MBchunks = Math.ceil(file.size / chunkSize),currentChunk = 0,spark = new SparkMD5.ArrayBuffer(),fileReader = new FileReader();fileReader.onload = function (e) {console.log('read chunk nr', currentChunk + 1, 'of', chunks);spark.append(e.target.result);                   // Append array buffercurrentChunk++;if (currentChunk < chunks) {loadNext();} else {console.log('finished loading');console.info('computed hash', spark.end());  // Compute hash}};fileReader.onerror = function () {console.warn('oops, something went wrong.');};function loadNext() {var start = currentChunk * chunkSize,end = ((start + chunkSize) >= file.size) ? file.size : start + chunkSize;fileReader.readAsArrayBuffer(blobSlice.call(file, start, end));}loadNext();
});

断点续传

即使将大文件拆分成切片上传,我们仍需等待所有切片上传完毕,在等待过程中,可能发生一系列导致部分切片上传失败的情形,如网络故障、页面关闭等。由于切片未全部上传,因此无法通知服务端合成文件。这种情况下可以通过断点续传来进行处理。

主要思路

1.在切片上传成功后,保存已上传的切片信息。2.当下次传输相同文件时,遍历切片列表,只选择未上传的切片进行上传。3.所有文件分片上传完毕,调用接口通知服务端进行合并。

对于切片信息的保存一般采用以下两种方式。

可以通过locaStorage等方式保存在前端浏览器中,这种方式不依赖于服务端,实现起来也比较方便,缺点在于如果用户清除了本地文件,会导致上传记录丢失。

服务端本身知道哪些切片已经上传,因此可以由服务端额外提供一个根据文件context查询已上传切片的接口,在上传文件前调用该文件的历史上传记录。

秒传

在上传切片前将文件的基本信息发送至服务端进行验证,判断该文件是否需要重新上传,如果已经上传就返回上传结果,实现秒传。

验证方法

1.文件名。2.文件最后修改的时间(File文件对象的一个属性 lastModified)。3.文件hash值。

分片上传,断点续传,还有秒传相关推荐

  1. springboot 大文件分片上传、断点续传和秒传

    目录 前置说明 获取文件分片 项目流程简述 关键代码解读 表设计SQL 接口测试 测试项目获取地址 前置说明 目前没弄前端,搁置后续再说.前端若打算使用element-ui的el-upload改造分片 ...

  2. 完整版断点续传、秒传,支持超大大大文件_支持重定义文件名和路径

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  3. 超大文件上传下载以及秒传、提速和限速方案完整(包含前后端)

    前言 文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上 ...

  4. 断点续传、秒传究竟是如何实现的?

    作者 | 喵叔 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 我们都用过网盘,不管是例如百度网盘之类的公共网盘,还是自己搭建的私有网盘,都会或多或少的涉及到断点续传和秒传.断点续传和秒 ...

  5. 大文件分片上传,断点续传,秒传 实现

    前段时间做视频上传业务,通过网页上传视频到服务器. 视频大小 小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长, ...

  6. SpringBoot 分片上传、断点续传、秒传、直传Minio

    最近在学习,在SpringBoot上进行分片上传.断点续传.直接上传到Minio服务器上,中间也遇到的不少坑.自定义minio继承MinioClient来实现分片上传.比较适合初学者. 一.大致的流程 ...

  7. springboot+阿里云OSS分片上传、断点续传、秒传

    最近工作中有使用到OSS的分片上传API,整体流程就是前端将大文件进行分割,每个分片大小是1MB,分片个数是:(文件总大小 / 单个分片大小),前端多线程处理上传分片到后端,后端接收到分片后调用OSS ...

  8. 大文件分片、并发上传,断点续传,秒传 第二弹

    继上次大文件分块上传原理见:http://blog.csdn.net/haohao123nana/article/details/51279098,博主终于有时间来真正的代码实现它. 关键部分 前端用 ...

  9. 秒传 php,网站图片上传可以实现秒传功能吗?

    比如360云盘等网盘,有时在上传文件时会有"秒传"效果,搜索了一下,这个原理是 每个文件都有自己独立的哈希值和MD5值,这样就可以在上传时判断该文件在服务器是否已经存在了,所以才能 ...

最新文章

  1. 【最新】三位深度学习创始人共同获得了2019年公布的图灵奖
  2. python拆堆和堆叠的操作_python - 如何合并不同的DFS并堆叠值? - 堆栈内存溢出
  3. 浮点卷积winograd算法
  4. tslib1.4安装小记
  5. linux生成文件清单,Linux 获取文件名称生成列表 txt - create_filelist
  6. LeetCode-18-4Sum
  7. 两台无线路由桥接(WDS)的简单方法(TP-LINK841N,当AP用)
  8. Java拦截器验证失败时返回Json格式数据
  9. ROS——创建工作空间并编译示例
  10. c语言程序设计实验指导实验十二,C语言程序设计实验指导
  11. 【Soil texture】土壤质地计算器
  12. 学大数据需要具备什么基础和知识点?
  13. 【你问我答】不包装简历是不是面试机会都没有?
  14. 帮我用js写一个微信聊天那种气泡效果
  15. 揭秘 手机群控 带来的利益
  16. PyTorch搭建卷积神经网络(ResNet-50网络)进行图像分类实战(附源码和数据集)
  17. 班章管家理财入门基础常识有什么?理财产品怎样买最合适
  18. OpenCV | Mat类的copyT、clone、=赋值的区别
  19. 快速定量,Abbkine 蛋白质定量试剂盒BCA法来了!
  20. Oracle中的CHR()函数

热门文章

  1. 长文剖析经典论文,揭晓 Facebook 广告排序模型!
  2. 腾讯云区块链产品负责人邵兵:产业区块链刚刚起步,做好基础设施才有可能进入2.0阶段
  3. CSDN 七夕包分配,最后一天啦!
  4. 基于容器的虚拟化资源调度系统架构设计 | 原力计划
  5. 从技术风口到行业应用,开启区块链与产业深度融合之路
  6. 第七届开源操作系统年度技术会议(OS2ATC)盛大开幕,从编译器到软件定义卫星精彩议题大曝光!...
  7. 首批共享单车死于 2019
  8. 60 岁的人工智能,会是“人类历史最后的事件”吗?
  9. 使用 JavaScript,也能在 Web 应用中实现人脸检测功能?!
  10. 面对 10 亿数据量的挑战,如何对系统进行性能优化?