vue實現(xiàn)頁面上傳文件夾壓縮后傳給服務(wù)器的操作
vue實現(xiàn)頁面上傳文件夾壓縮后傳給服務(wù)器
需求:點擊頁面按鈕上傳文件夾,但是需要經(jīng)過前端壓縮后再上傳到服務(wù)器(至于為什么不先打好壓縮包再直接上傳,領(lǐng)導(dǎo)的意思是他要上傳的文件在本地是加密的,上傳到瀏覽器的文件是解密的,并不是很懂但是需求還是得完成)
1.首先下載所需要的插件jszip和FileSaver
npm install jszip npm install file-saver //主要用來下載文件驗證上傳是否正確,不是剛需 //頁面引入 import JSZip from "jszip"; import FileSaver from "file-saver";
2.頁面標簽的話只需要一個button按鈕即可
<el-form-item label="上傳模板:" prop="fileName"> <el-button @click="handleChange">上傳文件夾</el-button> </el-form-item>
3.完整代碼
handleChange() { let input = document.createElement("input"); input.type = "file"; input.setAttribute("allowdirs", "true"); input.setAttribute("directory", "true"); input.setAttribute("webkitdirectory", "true"); //設(shè)置了webkitdirectory就可以選擇文件夾進行上傳了,el-upload也適用但方法不一樣 input.multiple = false; document.querySelector("body").appendChild(input); input.click(); let _this = this; input.onchange = async function (e) { let file = e.target["files"]; let path = file[0].webkitRelativePath; //取path是為了獲取上傳的文件夾一級的名稱 let name = path.split("/")[0]; console.log(name); let zip = new JSZip(); _this.forEachZip(zip, file); //處理文件夾里的所有子文件 // 生成壓縮文件 zip.generateAsync({ type: "blob" }).then((content) => { //將blob類型的再轉(zhuǎn)為file類型用于上傳 let zipFile = new File([content], `${name}.zip`, { type: "application/zip", }); //做個大小限制 let isLt2M = zipFile.size / 1024 / 1024 < 80; if (!isLt2M) { _this.fileList = []; _this.$message({ message: "上傳文件大小不能超過 80MB!", type: "warning", }); return false; } else { let filedata = new FormData(); filedata.append("file", zipFile); _this.handlesubmit(filedata); //這個地方換成自己的上傳事件即可,filedata已經(jīng)是壓縮好的文件了 // FileSaver.saveAs(content, `${name}.zip`); //下載用,可以下載下來文件查看上傳的是否正確 } }); document.querySelector("body").removeChild(input); }; }, forEachZip(zip, files) { for (let i = 0; i < files.length; i++) { //通過path將文件夾里的所有子文件歸類處理,主要是為了保持上傳后的文件夾目錄保持不變 zip.file(files[i].webkitRelativePath, files[i]); //如果想上傳后將里面的所有文件夾都歸類到一級可以用下面的方式 // let file = files[i]; // zip.file(file.name, file); } },
Vue 項目使用 jszip 和 file-saver 打包壓縮上傳文件夾
安裝包
npm install jszip npm install file-saver
引入包
import { saveAs } from 'file-saver' import JSZip from 'jszip'
1.設(shè)置input上傳文件
<input type="file" webkitdirectory="true" directory="true" @click="onupclick" @change="uploadFiles" style="width: 70px" />
2.當我們上傳完,必須的刷新頁面才能繼續(xù)上傳,只需要設(shè)置下面的即可,再次上傳
function onupclick(e: any) { percentage.value = 0;//上傳進度,可以使用element plus 進度條組件 e.target.files = null; e.target.value = ''; }
3.設(shè)置上傳函數(shù)
async function uploadFiles(e) { let res = await zipFile(2, e.target.files); const file = new File([res], 'projectdist.zip');//'projectdist.zip'為設(shè)置的文件名 upzip({ ftype: 1, file: file, mode: mode.value }); } async function zipFile(index: number, fileList: FileList, onProgress: (added: number) => void) { const zip = new JSZip(); let i = 0; for await (let f of fileList) { const fileData = await readAsArrayBuffer(f); zip.file(f.webkitRelativePath, fileData, { createFolders: true }); i++; onProgress && onProgress(i); } return zip.generateAsync({ type: 'blob', compression: 'DEFLATE', compressionOptions: { level: 9 } }, function updateCallback(metadata) { // 進度條 percentage.value = +metadata.percent.toFixed(2); // console.log('進度條', metadata.percent.toFixed(2) + '% done'); }); //zip.generateAsync({ type: 'blob' }) // .then(function (zipBlob) { // 在這里可以進行上傳操作,將 zipBlob 發(fā)送到服務(wù)器 // 也可以通過 FileSaver.js 將 ZIP 文件保存到本地 // FileSaver.saveAs(zipBlob, '壓縮包名稱.zip'); // }) //.catch(function (error) { // console.error('壓縮視頻失敗:', error); // }); } async function readAsArrayBuffer(file: Blob): Promise<ArrayBuffer> { return new Promise((resolve, reject) => { let reader = new FileReader(); reader.readAsArrayBuffer(file); reader.onload = () => { resolve(reader.result as ArrayBuffer); }; reader.onloadend = () => { reject('FileReader failed'); }; }); } //把文件上傳給服務(wù)端 async function upzip(formData: any) { try { const { code, msg } = await upload_file(formData); if (code > 0) { ElMessage({ showClose: true, message: '上傳成功', type: 'success', }); } else { ElMessage({ showClose: true, message: '上傳失敗' + msg, type: 'error', duration: 0, }); } } catch (e) { ElMessage({ showClose: true, message: '錯誤: ' + e, type: 'error', duration: 0, }); } }
到此這篇關(guān)于vue實現(xiàn)頁面上傳文件夾壓縮后傳給服務(wù)器的文章就介紹到這了,更多相關(guān)vue上傳文件夾壓縮傳給服務(wù)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue+jquery實現(xiàn)表格指定列的文字收縮的示例代碼
這篇文章主要介紹了Vue+jquery實現(xiàn)表格指定列的文字收縮的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01vue v-for出來的列表,點擊某個li使得當前被點擊的li字體變紅操作
這篇文章主要介紹了vue v-for出來的列表,點擊某個li使得當前被點擊的li字體變紅操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07Vue Vine實現(xiàn)一個文件中寫多個組件的方法(最近很火)
Vue Vine提供了全新Vue組件書寫方式,主要的賣點是可以在一個文件里面寫多個vue組件,Vue Vine是一個vite插件,vite解析每個模塊時都會觸發(fā)插件的transform鉤子函數(shù),本文介紹Vue Vine是如何實現(xiàn)一個文件中寫多個組件,感興趣的朋友一起看看吧2024-07-07Vue 3 + Element Plus 封裝單列控制編輯的可編輯表格
在Web應(yīng)用開發(fā)中實現(xiàn)表格數(shù)據(jù)編輯功能至關(guān)重要,本文將詳細介紹如何使用Vue3和ElementPlus庫來構(gòu)建一個支持單列編輯的表格組件,本教程詳細闡述了組件創(chuàng)建過程和數(shù)據(jù)綁定機制,幫助你快速掌握Vue3中表格編輯功能的實現(xiàn),感興趣的朋友一起看看吧2024-09-09