vue实现大文件切片断点续传

 更新时间:2023年07月25日 09:06:21   作者:地霊殿__三無  
上传文件,基本上用了input框就可以解决,但大文件应该怎样上传呢,一次性上传明显不现实,因为每次一断网,那就会从头开始上传,所以切片势在必行,关键就是如何切,怎么保障文件数据不会丢失,同时优化上传保障机制,本文就来给大家讲讲如何上传大文件

一、前言

说起上传文件,基本上用了input框就可以解决。

直到这天,后端找到我说,这个100g的视频,看看怎么样才能上传。

100g,我看了看飘红的c盘(剩余空间7.86g),好家伙,我c盘都放不下100g,你现在要我通过网页上传。

没法子,只好开干了。

二、整体思路

这么大文件,一次性上传明显不现实,因为每次一断网,那就会从头开始上传,体验感极差。所以切片势在必行,关键就是如何切,怎么保障文件数据不会丢失,同时优化上传保障机制。

1、切片

不管是input还是el-upload组件,本质上拿到的文件都是blob文件格式,blob文件自带一个slice方法,可以用来分割切片。

//一个新的 [`Blob`] 对象,它包含了原始 [`Blob`]对象的某一个段的数据
// slice接受三个参数start、end、和contentType(可选)
// start和end的距离差就是切片的文件大小,以字节为单位
const chunk = file.slice(start, end);
const blob = new Blob([chunk], { type: file.type })

这里的blob就是每一个切片了,相当于每一个个小文件。

2、计算切片唯一码:md5或者hash值

js-md5  计算切片md5
spark-md5.min.js   计算hash值

如果不大的话,选用js-md5即可,如果文件巨大,那可能会引起阻塞,导致页面假死,所以可以选用spark-md5.min.js,来计算hash值,它使用 web-worker 在 worker 线程计算 hash,这样用户仍可以在主界面正常的交互。根据实际情况选择即可,但记得提前跟后端沟通。

具体计算方法网上很多,就不赘述了。

计算完后,将每一个切片和对应的唯一码关联起来,待下一步使用。

3、切片上传

按小文件的形式,普通地上传每一片。

同时需要将切片数和第二点的唯一码,也附上,给到后端进行文件检验。

根据校验成功与否,对应返回唯一码和状态,前端标记已完成和未完成的切片,

可以对失败或者未完成的切片进行重传操作。

如果有并行上传需求,那可以使用Promise.race()进行并发请求,用Promise.all()来获取最终完成情况。

但这也需要考虑并行数量对性能的影响。

4、上传前检测切片是否存在于后端

有时候因为网络等问题,可能会导致上传过程中途失败等等原因,再次上传就是重头开始了。

这就会造成一种浪费吧,明明该切片在服务器上已经有了,有覆盖还行,没有覆盖的话,那对最终的合并肯定是会造成影响的。

所以在上传前,可先提前发起请求,询问切片是否存在。

存在则秒传完成,不存在则继续上传,走第3点。

5、发送合并请求

在全部上传完之后,同时全部都是成功的情况下,前端主动发送合并请求,携带未

切片前源文件的md5或者hash值,后端接到请求合并切片,在同路径下,重现文件,并对比

md5码或者hash值,一致则返回成功。

三、小结

本文基本上只是叙述了整体思路,思路理顺了,剩下的只是在对应的位置写入具体的业务逻辑即可。

到此这篇关于vue实现大文件切片断点续传的文章就介绍到这了,更多相关vue大文件断点续传内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vuejs父子组件之间数据交互详解

    vuejs父子组件之间数据交互详解

    这篇文章主要为大家详细介绍了vuejs父子组件之间的数据交互,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Vue代理请求数据出现404问题及解决

    Vue代理请求数据出现404问题及解决

    这篇文章主要介绍了Vue代理请求数据出现404的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Vue PC前端扫码登录功能实现

    Vue PC前端扫码登录功能实现

    最近在做APP客户端扫描PC端二维码登录,于是记录一下实现过程,下面这篇文章主要给大家介绍了关于Vue PC前端扫码登录功能实现的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • vue如何通过点击事件实现页面跳转详解

    vue如何通过点击事件实现页面跳转详解

    页面跳转,我们一般都通过路由跳转实现,通常情况下可直接使用router-link标签实现页面跳转,下面这篇文章主要给大家介绍了关于vue如何通过点击事件实现页面跳转的相关资料,需要的朋友可以参考下
    2022-07-07
  • vue 中使用 this 更新数据的一次问题记录

    vue 中使用 this 更新数据的一次问题记录

    这篇文章主要介绍了vue 中使用 this 更新数据的一次大坑 ,我在 vue 实例中声明了一个数组属性如 books: [],在异步请求的回调函数中使用 this.books = res.data.data; 进行数据更新,感兴趣的朋友跟随小编一起看看吧
    2022-11-11
  • vue3中关于路由hash与History的设置

    vue3中关于路由hash与History的设置

    这篇文章主要介绍了vue3中关于路由hash与History的设置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • vue在路由中验证token是否存在的简单实现

    vue在路由中验证token是否存在的简单实现

    今天小编就为大家分享一篇vue在路由中验证token是否存在的简单实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • element ui提交表单返回成功后自动清空表单的值的实现代码

    element ui提交表单返回成功后自动清空表单的值的实现代码

    这篇文章主要介绍了elementui提交表单返回成功后自动清空表单的值,本文通过两种方法结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • 利用vue组件实现图片的拖拽和缩放功能

    利用vue组件实现图片的拖拽和缩放功能

    这篇文章主要给大家介绍了关于利用vue组件实现图片的拖拽和缩放功能的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • Antd表格滚动 宽度自适应 不换行的实例

    Antd表格滚动 宽度自适应 不换行的实例

    这篇文章主要介绍了Antd表格滚动 宽度自适应 不换行的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10

最新评论