Vue文件分片上传

news/2024/11/17 14:49:17/

在开发中,如果上传的文件过大,可以考虑分片上传,分片就是说将文件拆分来进行上传,将各个文件的切片传递给后台,然后后台再进行合并。这里切片可以理解为字符串的截取,那这里文件的话就是切分字节,一个道理

上传的时候,可能会需要一个文件的唯一 标识,在上传文件的时候也要将文件的唯一标识(文件的MD5加密文件的字符串,每个文件的唯一标识)传递给后端,后端会通过该标识返回给我们告诉我们这个文件是否已经上传过,没有这个文件就需要我们全部上传,存在了,前端就不需要再上传,这个文件上传了一部分,需要把剩余的上传

这个文件的MD5唯一标识呢,也是通过spark-md5来获取,具体步骤 :

安装 

npm i spark-md5
or
pnpm add spark-md5

按需引入 ,并封装方法

可以单独建个js文件,向外暴露出去 

method.js 

import SparkMD5 from 'spark-md5'// 获取文件的唯一MD5标识码
export function getFileMd5(file) {return new Promise((resolve, reject) => {const fileReader = new FileReader()const spark = new SparkMD5.ArrayBuffer()fileReader.readAsArrayBuffer(file)fileReader.onload = e => {spark.append(e.target.result)let md5 = spark.end()resolve(md5)}})
}

然后我们提交的时候,我们得让后台知道提交的是哪一部分的切片,不能驴头不对马嘴,闲话不多说了,我这里把核心代码贴上,大家有点儿基础的,仔细看下就懂得了,没有很复杂 

我这里用的是Vue3 + element-plus中的el-upload 

<div class="index"><el-uploadv-model:file-list="fileList"class="upload-demo":auto-upload="false":limit="1":on-change="handleChange"><el-button type="primary">Click to upload</el-button></el-upload>
</div>
<script setup>
import { ref } from 'vue'
import { getFileMd5 } from './method'const fileList = ref([])// 文件上传 选择文件时触发(:on-change事件)
const handleChange = async (uploadFile, uploadFiles) => {// 文件信息let fileRaw = uploadFile.rawconsole.log(fileRaw)// 获取 文件的 MD5唯一标识码let fileMd5 = nulltry {fileMd5 = await getFileMd5(fileRaw)} catch(e) {console.error('[error]', e)}if(!fileMd5) return// 每片的大小为 5M 可调整const chunkSize = 5 * 1024 * 1024// 文件分片储存let chunkList = []function chunkPush(page = 1) {chunkList.push(fileRaw.slice((page - 1) * chunkSize, page * chunkSize))if(page * chunkSize < fileRaw.size) {chunkPush(page + 1)}}chunkPush()console.log(chunkList, 'chunkList----->>>')saveFileChunk(chunkList, fileMd5, fileRaw.name)
}
// 保存文件片段到后台
const saveFileChunk = async (chunkList, fileMd5, fileName) => {for(let i = 0; i < chunkList.length; i++) {let formData = new FormData()formData.append('chunk', i) // 当前片段的索引formData.append('chunkSize', 5 * 1024 * 1024) // 切片的文件分片大小 (就是以多少字节进行分片的,这里是5M)formData.append('chunks', chunkList.length) // 共有多少分片formData.append('file', chunkList[i]) // 当前分片的文件流formData.append('md5', fileMd5) // 整个文件的MD5唯一标识码,不是分片formData.append('name', fileName) // 文件的名称formData.append('size', chunkList[i].size) // 当前切片的大小(最后一片不一定是5M)const data = await saveFileChunk(formData)if(data && data.success) {console.log('保存成功')}}
}
</script>

灵感来自:# vue 实现文件切上传 


http://www.ppmy.cn/news/744441.html

相关文章

b站选择HTML5播放器,b站用什么播放器看片好?选择硬解还是软解?看本地视频首选哪一个?...

b站看视频的时候&#xff0c;我们经常会遇到视频卡顿或者视频黑屏等一系列的症状&#xff0c;有时候我们采用各种方式都不能进行解决&#xff0c;其实这是和播放器的类型有关&#xff0c;一般来说B站都有默认的播放器进行视频播放&#xff0c;除了常规的播放器之外&#xff0c;…

HTTP方式文件分片断点下载

前言 在进行大文件或网络带宽不是很好的情况下&#xff0c;分片断点下载就会显得很有必要&#xff0c;目前各大下载工具&#xff0c;如&#xff1a;迅雷&#xff0c;都是很好的支持分片断点下载功能的。本文就通过http方式进行文件分片断点下载&#xff0c;进行实战说明。 HTTP…

安利一个超牛的资源网站,国庆看片就用它了

点击上方“GitHubPorn”&#xff0c;选择“星标”公众号 重磅干货&#xff0c;第一时间送达 来自公众号&#xff1a;扩展迷EXTFANS 作者&#xff1a;okay 国庆8天长假&#xff0c;你们有什么计划吗&#xff1f; 对于许多小伙伴来说&#xff0c;比起出门旅游&#xff0c;假期最爽…

什么是卫片?什么是卫片执法?一文了解卫片执法基础知识

一、什么是卫片? 通俗来说&#xff0c;就是卫星拍的照片&#xff0c;卫片如同“天眼”&#xff0c;通过卫片的“火眼金睛”&#xff0c;各种非法占地的情况一览无遗。 自然资源部通过卫星对全国范围内土地拍摄照片&#xff0c;并与上一轮拍摄的照片进行比对&#xff0c;只要…

IP分片与TCP分包

TCP/IP 协议栈中定义了MSS, 为的是提高网络的性能&#xff0c;因为如果让IP层分包的话&#xff0c;丢包后的重发没法控制&#xff0c;需要重传整个TCP包&#xff08;浪费了网络资源&#xff09;。 MSS就是这个协商的结果&#xff0c;不能人为修改&#xff0c;这个MSS的大小是MT…

【设计模式】第九章:外观模式(门面模式)详解及应用案例

系列文章 【设计模式】七大设计原则 【设计模式】第一章&#xff1a;单例模式 【设计模式】第二章&#xff1a;工厂模式 【设计模式】第三章&#xff1a;建造者模式 【设计模式】第四章&#xff1a;原型模式 【设计模式】第五章&#xff1a;适配器模式 【设计模式】第六章&…

闲谈IPv6-IPv6的分片(IPv6 Fragment)

从去年9月初以来&#xff0c;我把做实验写博客写代码的时间放在了晚上&#xff0c;但是现在&#xff0c;晚上要早睡觉&#xff0c;白天要被指使着干这干那&#xff0c;感觉还是周六的凌晨更是自己的时间。 本文最后&#xff0c;夹杂着一则关于 “皮鞋为什么比布鞋落后&#xf…

判断一个key在redis集群的哪一个节点(分片)

redis的集群模式下去需要确定一个key在哪个节点上的话&#xff0c;简单粗暴的就是一个个节点找过去。但是这样明显是费时费力的。 其实可以直接确定这个key在redis的哪个节点上&#xff0c;然后直接去这个节点找这个key就可以了. 1-先查看集群的几个节点的分片范围情况 ./re…