利用Vue3+Element-plus實(shí)現(xiàn)大文件分片上傳組件
一、背景
實(shí)際項(xiàng)目中遇到需要上傳幾十個(gè)G的3d模型文件,傳統(tǒng)上傳就不適用了。
結(jié)合element提供的上傳組件自己封裝了文件分片上傳的組件。
思路:
- 把文件拆分成若干分片
- 依次上傳分片(每次上傳前可校驗(yàn)該分片是否已經(jīng)上傳)
- 發(fā)起合并分片的請(qǐng)求
二、技術(shù)棧
Vue3+Ts+Element-Plus
其他庫(kù):spark-md5
后端接口:
- 上傳分片接口
- 校驗(yàn)分片是否已上傳接口
- 合并分片接口
三、核心代碼實(shí)現(xiàn)
Element組件基礎(chǔ)配置
<el-upload drag :file-list="fileList" :on-change="onUpload" :auto-upload="false" ref="uploadfile" :limit="1" :show-file-list="false" ></el-upload>
這里有個(gè)點(diǎn):必須要定義file-list屬性,不然clearFiles等官方外部方法沒(méi)有效果
核心方法就是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) // 分片數(shù)量 if(chunkSize > fileSize){ // 文件過(guò)小就一片 chunkCount = 1 } // 文件md5,給文件一個(gè)唯一標(biāo)識(shí) const fileMd5 = await getFileMd5(file, chunkCount, chunkSize); // 上傳分片 for( let i=0;i<chunkCount;i++) { const start = i * chunkSize //分片開(kāi)始 const end = Math.min(fileSize, start + chunkSize) // 分片結(jié)束 const _chunkFile = File.raw.slice(start, end) // 分片文件 // 定義分片上傳接口參數(shù),跟后端商定 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) // 檢查分片文件是否上傳-沒(méi)有上傳則上傳 const params = { chunkNumber: i, fileSign: fileMd5 } const { data } = await checkChunkFile(params) // 檢驗(yàn)接口-自己定義 if(!data.flag){ console.log("開(kāi)始上傳第" + i + "個(gè)分片") await uploadChunkFile(formdata) // 上傳接口-自己定義 } } // 合并 const mergeData = { // 合并參數(shù) 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 方法是同步任務(wù),文件過(guò)大會(huì)等待很久,可對(duì)頁(yè)面進(jìn)行優(yōu)化處理,不然會(huì)造成卡著沒(méi)進(jìn)行請(qǐng)求的錯(cuò)覺(jué)。
四、總結(jié)
至于其他進(jìn)度條、組件參數(shù)等代碼忽略掉了,可根據(jù)實(shí)際情況設(shè)計(jì)。
上面的核心代碼很多內(nèi)容是還可以拆分的,優(yōu)化空間很大。
該組件是一個(gè)一個(gè)分片的上傳,去掉await 就可以測(cè)試多個(gè)文件上傳。
到此這篇關(guān)于利用Vue3+Element-plus實(shí)現(xiàn)大文件分片上傳組件的文章就介紹到這了,更多相關(guān)Vue3 Element-plus大文件分片上傳組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Vue如何實(shí)現(xiàn)文件預(yù)覽和下載功能的前端上傳組件
- Vue框架+Element-ui(el-upload組件)使用http-request方法上傳文件并顯示文件上傳進(jìn)度功能
- vue2中基于vue-simple-upload實(shí)現(xiàn)文件分片上傳組件功能
- vue3.0搭配.net core實(shí)現(xiàn)文件上傳組件
- Vue開(kāi)發(fā)之封裝上傳文件組件與用法示例
- Vue封裝一個(gè)簡(jiǎn)單輕量的上傳文件組件的示例
- vue webuploader 文件上傳組件開(kāi)發(fā)
- Vue 中自定義文件上傳組件的實(shí)現(xiàn)代碼
相關(guān)文章
vue和小程序項(xiàng)目中使用iconfont的方法
這篇文章主要介紹了vue中和小程序中使用iconfont的方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05vue實(shí)現(xiàn)iview表格添加篩選功能的示例代碼
本文主要介紹了vue實(shí)現(xiàn)iview表格添加篩選功能的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07使用Vue3和p5.js實(shí)現(xiàn)交互式圖像動(dòng)畫(huà)
這篇文章主要介紹了如何用Vue3和p5.js打造一個(gè)交互式圖像動(dòng)畫(huà),文中給出了詳細(xì)的代碼示例,本代碼適用于需要在網(wǎng)頁(yè)中實(shí)現(xiàn)圖像滑動(dòng)效果的場(chǎng)景,例如圖片瀏覽、相冊(cè)展示等,感興趣的小伙伴跟著小編一起來(lái)看看吧2024-06-06Vue實(shí)現(xiàn)頁(yè)面刷新跳轉(zhuǎn)到當(dāng)前頁(yè)面功能
在Vue.js應(yīng)用開(kāi)發(fā)中,有時(shí)候我們需要實(shí)現(xiàn)頁(yè)面的刷新或跳轉(zhuǎn)到當(dāng)前頁(yè)面的功能,這種需求在某些特定場(chǎng)景下非常有用,本文將詳細(xì)介紹如何在Vue中實(shí)現(xiàn)頁(yè)面刷新和跳轉(zhuǎn)到當(dāng)前頁(yè)面的功能,并提供多個(gè)示例和使用技巧,需要的朋友可以參考下2024-10-10