利用Vue3+Element-plus实现大文件分片上传组件

目录
  • 一、背景
  • 二、技术栈
  • 三、核心代码实现
  • 四、总结

一、背景

实际项目中遇到需要上传几十个G的3d模型文件,传统上传就不适用了。

结合element提供的上传组件自己封装了文件分片上传的组件。

思路:

  • 把文件拆分成若干分片
  • 依次上传分片(每次上传前可校验该分片是否已经上传)
  • 发起合并分片的请求

二、技术栈

Vue3+Ts+Element-Plus

其他库:spark-md5

后端接口:

  • 上传分片接口
  • 校验分片是否已上传接口
  • 合并分片接口

三、核心代码实现

Element组件基础配置

<el-upload drag :file-list="fileList" :on-change="onUpload" :auto-upload="false" ref="uploadfile" :limit="1" :show-file-list="false" ></el-upload>

这里有个点:必须要定义file-list属性,不然clearFiles等官方外部方法没有效果

核心方法就是onUpload

const onUpload = async (File:any) => {
	const chunkSize = 30 * 1024 * 1024; // 分片大小
	const file = File.raw // 文件
	const fileSize = File.size // 文件大小
	let chunkCount = Math.ceil(fileSize / chunkSize) // 分片数量
	if(chunkSize > fileSize){ // 文件过小就一片
	    chunkCount = 1
	}
	// 文件md5,给文件一个唯一标识
	const fileMd5 = await getFileMd5(file, chunkCount, chunkSize);
	// 上传分片
	for( let i=0;i<chunkCount;i++) {
    	const start = i * chunkSize //分片开始
    	const end = Math.min(fileSize, start + chunkSize) // 分片结束
    	const _chunkFile = File.raw.slice(start, end) // 分片文件
    	// 定义分片上传接口参数,跟后端商定
    	const formdata = new FormData()
	    formdata.append('chunkNumber', i.toString())
	    formdata.append('chunkSize', _chunkFile.size)
	    formdata.append('file', _chunkFile)
	    formdata.append('fileName', File.name)
	    formdata.append('fileSign', fileMd5)
	    formdata.append('totalChunks', chunkCount.toString())
	    formdata.append('totalChunkSize', fileSize)

	    // 检查分片文件是否上传-没有上传则上传
	    const params = { chunkNumber: i, fileSign: fileMd5 }
    	const { data } = await checkChunkFile(params) // 检验接口-自己定义
	    if(!data.flag){
	      console.log("开始上传第" + i + "个分片")
	      await uploadChunkFile(formdata) // 上传接口-自己定义
	    }
  	}

	// 合并
	const mergeData = { // 合并参数
	    fileName: File.name,
	    fileSign: fileMd5,
	    ...
	 }
	mergeFile(mergeData)// 合并接口-自己定义
}

getFileMd5方法生成文件md5

const getFileMd5 = (file: File, chunkCount: number, chunkSize: number) => {
  return new Promise((resolve, reject) => {
    const blobSlice = File.prototype.slice
    const chunks = chunkCount
    let currentChunk = 0
    const spark = new SparkMD5.ArrayBuffer()
    const fileReader = new FileReader()
    fileReader.onload = e => {
      spark.append(e.target?.result)
      currentChunk ++
      if(currentChunk < chunks){
        loadNext()
      } else {
        const md5 = spark.end()
        resolve(md5)
      }
    }
    fileReader.onerror = e => {
        reject(e)
    }
    function loadNext () {
        const start = currentChunk * chunkSize
        let end = start + chunkSize
        if(end > file.size){
            end = file.size
        }
        fileReader.readAsArrayBuffer(blobSlice.call(file, start, end))
    }
    loadNext()
  })
}

getFileMd5 方法是同步任务,文件过大会等待很久,可对页面进行优化处理,不然会造成卡着没进行请求的错觉。

四、总结

至于其他进度条、组件参数等代码忽略掉了,可根据实际情况设计。

上面的核心代码很多内容是还可以拆分的,优化空间很大。

该组件是一个一个分片的上传,去掉await 就可以测试多个文件上传。

到此这篇关于利用Vue3+Element-plus实现大文件分片上传组件的文章就介绍到这了,更多相关Vue3 Element-plus大文件分片上传组件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用Vue3+ElementPlus前端实现分片上传的全过程

    目录 1. 什么是分片上传 2. 上传组件模板 3. 上传组件逻辑 3.1 基本思路 3.2 选择上传文件 3.3 校验文件是否合法 3.4 文件加密 3.5 合并文件 3.6 文件切片上传 4. 参考文章 4.1 文章链接 4.2 参考文章提到的注意事项 4.2.1 nginx 上传大小限制 4.2.2 大文件下载 总结 1. 什么是分片上传 将 一个文件 切割为 一系列特定大小的 数据片段,将这些 数据片段 分别上传到服务端: 全部上传完成后,再由服务端将这些 数据片段 合并成为一个完整的资

  • 利用Vue3+Element-plus实现大文件分片上传组件

    目录 一.背景 二.技术栈 三.核心代码实现 四.总结 一.背景 实际项目中遇到需要上传几十个G的3d模型文件,传统上传就不适用了. 结合element提供的上传组件自己封装了文件分片上传的组件. 思路: 把文件拆分成若干分片 依次上传分片(每次上传前可校验该分片是否已经上传) 发起合并分片的请求 二.技术栈 Vue3+Ts+Element-Plus 其他库:spark-md5 后端接口: 上传分片接口 校验分片是否已上传接口 合并分片接口 三.核心代码实现 Element组件基础配置 <el-

  • .NET Core Web APi大文件分片上传研究实现

    前言 前两天发表利用FormData进行文件上传,然后有人问要是大文件几个G上传怎么搞,常见的不就是分片再搞下断点续传,动动手差不多也能搞出来,只不过要深入的话,考虑的东西还是很多.由于断点续传之前写个几篇,这里试试利用FormData来进行分片上传. .NET Core Web APi文件分片上传 这里我们依然是使用FormData来上传,只不过在上传之前对文件进行分片处理,如下HTML代码 <div class="form-horizontal" style="ma

  • Java实现浏览器端大文件分片上传

    目录 背景介绍 项目介绍 需要知识点 启动项目 项目示范 核心讲解 核心原理 功能分析 分块上传 秒传功能 断点续传 总结 参考文献 背景介绍   Breakpoint-http,是不是觉得这个名字有点low,break point断点.这是一个大文件上传的一种实现.因为本来很久没写过前端了,本来想自己好好写一番js,可惜因为种种原因而作罢了.该项目是基于一款百度开源的前端上传控件:WebUploader(百度开源的东西文档一如既往的差,哈哈.或者是我理解能力差).   Breakpoint-h

  • React+Node实现大文件分片上传、断点续传秒传思路

    目录 1.整体思路 2.实现步骤 2.1 文件切片加密 2.2 查询上传文件状态 2.3 秒传 2.4 上传分片.断点续传 2.5 合成分片还原完整文件 3.总结 4.后续扩展与思考 5.源码 1.整体思路 将文件切成多个小的文件: 将切片并行上传: 所有切片上传完成后,服务器端进行切片合成: 当分片上传失败,可以在重新上传时进行判断,只上传上次失败的部分实现断点续传: 当切片合成为完整的文件,通知客户端上传成功: 已经传到服务器的完整文件,则不需要重新上传到服务器,实现秒传功能: 2.实现步骤

  • Java超详细大文件分片上传代码

    目录 Java 大文件分片上传 首先是交互的控制器 上传文件分片参数接收 大文件分片上传服务类实现 文件分片上传定义公共服务类接口 文件分片上传文件操作接口实现类 OSS阿里云对象存储分片上传实现 京东云对象存储实现 腾讯云对象存储分片上传 分片上传前端代码实现 Java 大文件分片上传 原理:前端通过js读取文件,并将大文件按照指定大小拆分成多个分片,并且计算每个分片的MD5值.前端将每个分片分别上传到后端,后端在接收到文件之后验证当前分片的MD5值是否与上传的MD5一致,待所有分片上传完成之

  • vue 大文件分片上传(断点续传、并发上传、秒传)

    对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送.接收都是不可取,很容易导致内存问题.所以对于大文件上传,采用切块分段上传,从上传的效率来看,利用多线程并发上传能够达到最大效率. 本文是基于 springboot + vue 实现的文件上传,本文主要介绍vue实现文件上传的步骤及代码实现,服务端(springboot)的实现步骤及实现请移步本人的另一篇文章: springboot 大文件上传.分片上传.断点续传.秒传 上传分步: 本人分析上传总共分为: MD5读取文件,获取文件的

  • webuploader在springMVC+jquery+Java开发环境下的大文件分片上传的实例代码

    注意: 1,webuploader上传组件会和jQuery自带的上传组件冲突,所以不要使用<form>标签中添加上传文件的属性; enctype="multipart/form-data" 2.并且屏蔽ApplicationContext-mvc.xml里面的拦截配置! <!-- 上传拦截,如最大上传值及最小上传值 --> <!--新增加的webuploader上传组件,必须要屏蔽这里的拦截机制 <bean id="multipartRes

  • PHP大文件分片上传的实现方法

    一.前言 在网站开发中,经常会有上传文件的需求,有的文件size太大直接上传,经常会导致上传过程中耗时太久,大量占用带宽资源,因此有了分片上传. 分片上传主要是前端将一个较大的文件分成等分的几片,标识当前分片是第几片和总共几片,待所有的分片均上传成功的时候,在后台进行合成文件即可. 二.开发过程中遇到的问题 分片的时候每片该分多大size?太大会出现"413 request entity too large" 分片上传的时候并不是严格按照分片的序号顺序上传,如何判断所有的分片均上传成功

  • JavaScript实现大文件分片上传处理

    很多时候我们在处理文件上传时,如视频文件,小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题: 1.文件过大,超出服务端的请求大小限制: 2.请求时间过长,请求超时: 3.传输中断,必须重新上传导致前功尽弃 这些问题很影响用户的体验感,所以下面介绍一种基于原生JavaScript进行文件分片处理上传的方案,具体实现过程如下: 1.通过dom获取文件对象,并且对文件进行MD5加密(文件内容+文件标题形式),采用SparkMD5进行文件加密: 2.进行分片设置,文件Fil

  • 前端使用koa实现大文件分片上传

    目录 引言 前端 拆分上传的文件流 后端 接收文件片段 合并文件片段 总结 引言 一个文件资源服务器,很多时候需要保存的不只是图片,文本之类的体积相对较小的文件,有时候,也会需要保存音视频之类的大文件.在上传这些大文件的时候,我们不可能一次性将这些文件数据全部发送,网络带宽很多时候不允许我们这么做,而且这样也极度浪费网络资源. 因此,对于这些大文件的上传,往往会考虑用到分片传输. 分片传输,顾名思义,也就是将文件拆分成若干个文件片段,然后一个片段一个片段的上传,服务器也一个片段一个片段的接收,最

随机推荐