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大文件断点续传内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文详解Vue.js与TypeScript的生命周期

    一文详解Vue.js与TypeScript的生命周期

    Vue与TypeScript的结合使得开发大型应用变得更加容易和高效,本文将详细探讨Vue.js组件中TypeScript的应用,特别是它的生命周期钩子函数,并通过丰富的示例,为你提供一个实战指南,需要的朋友可以参考下
    2023-11-11
  • 浅谈vue 移动端完美适配方案

    浅谈vue 移动端完美适配方案

    最近接触了一个项目,vue怎么在不同屏幕上做根据不同屏幕大小适配,本文就详细的来介绍一下,感兴趣的可以了解一下
    2021-09-09
  • 详解Vue SPA项目优化小记

    详解Vue SPA项目优化小记

    这篇文章主要介绍了详解Vue SPA项目优化小记,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • uniapp微信小程序WebApi_openid、phone接口获取代码详解

    uniapp微信小程序WebApi_openid、phone接口获取代码详解

    本文主要记录了微信小程序接口调用的过程,首先查看uniapp文档和微信API文档,获取openid和phone,然后通过uniapp实现获取openid和电话号码,但遇到了合法域名屏蔽的问题,最后通过将微信访问迁移到后台解决,需要的朋友可以参考下
    2024-10-10
  • vue-cli 如何打包上线的方法示例

    vue-cli 如何打包上线的方法示例

    这篇文章主要介绍了vue-cli 如何打包上线的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Vue使用xlsx组件轻松实现Excel导出的完整代码

    Vue使用xlsx组件轻松实现Excel导出的完整代码

    在日常开发中,Excel导出是管理系统的高频需求,本文手把手教你如何在Vue项目中快速实现Excel导出功能,支持复杂表格样式,并附赠性能优化方案,需要的朋友可以参考下
    2025-05-05
  • Vue input控件通过value绑定动态属性及修饰符的方法

    Vue input控件通过value绑定动态属性及修饰符的方法

    这篇文章主要介绍了 Vue input控件通过value绑定动态属性及修饰符的方法,需要的朋友可以参考下
    2017-05-05
  • Vue子组件关闭后调用刷新父组件的实现

    Vue子组件关闭后调用刷新父组件的实现

    这篇文章主要介绍了Vue子组件关闭后调用刷新父组件的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 基于Vue3和SpringBoot实现Web实时消息推送功能

    基于Vue3和SpringBoot实现Web实时消息推送功能

    这篇文章主要介绍了WebSocket实现实时通信,对比HTTP低效,通过SpringBoot+Vue整合实现消息推送,涵盖聊天、股票等场景,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2025-05-05
  • vue3 Composition API使用示例教程

    vue3 Composition API使用示例教程

    Vue3新增了Composition API,我们只需将实现某一功能的相关代码全部放进一个函数中,然后return需要对外暴露的对象,这篇文章主要介绍了vue3 Composition API使用,需要的朋友可以参考下
    2022-12-12

最新评论