vue項(xiàng)目使用jszip和file-saver批量打包壓縮圖片或附件方式
使用jszip和file-saver批量打包壓縮圖片或附件
背景:
圖片上傳功能用戶(hù)會(huì)批量上傳好多個(gè),并且圖片可能還會(huì)很大,于是就采用了前端先壓縮,然后將壓縮包直接傳給后端。
1、安裝插件:
npm install jszip npm install file-saver
2、在頁(yè)面中引入插件:
import JSZip from 'jszip'; import FileSaver from 'file-saver'; // 定義全局的 zip const zip = new JSZip();
注釋?zhuān)涸谝虢M件的位置定義一個(gè)全局的 zip 用于文件的壓縮
3、element UI 上傳組件:
<el-upload class="upload-demo" accept=".jpg,.JPG,.png,.PNG" action="#" :multiple="true" :auto-upload="false" :on-change="handleChange1" :show-file-list="false" :file-list="fileList1"> <el-button size="small" type="primary">選擇文件</el-button> </el-upload> <el-button class="handle-upload" size="small" type="primary" @click="uploadData()" :loading="loadingFile1">開(kāi)始上傳</el-button>
4、初始化 data 數(shù)據(jù):
export default { data() { return { fileList1: [], // 待上傳圖片數(shù)據(jù) } } }
5、添加圖片選擇的 onchange 方法:
export default { methods: { // 上傳圖片 handleChange1(file, fileList) { const that = this; const _file = file.raw; let blob = new Blob([_file], { type: _file.type}); zip.file(_file.name, blob); this.fileList1 = fileList; }, // 開(kāi)始上傳 uploadData(){ // 生成 ZIP 文件 zip.generateAsync({ type: 'blob' }) .then(function (zipBlob) { // 在這里可以進(jìn)行上傳操作,將 zipBlob 發(fā)送到服務(wù)器 // 也可以通過(guò) FileSaver.js 將 ZIP 文件保存到本地 FileSaver.saveAs(zipBlob, '壓縮包名稱(chēng).zip'); }) .catch(function (error) { console.error('壓縮視頻失敗:', error); }); } } }
注釋?zhuān)簔ip. 屬性是在第二步中進(jìn)行定義的,具體請(qǐng)參考第二步
至此前端附件壓縮完成?。?!
附加:從服務(wù)器獲取附件,進(jìn)行壓縮下載
1、安裝插件:
npm install jszip
2、在頁(yè)面中引入插件:
import JSZip from 'jszip';
3、第3 、4步同上
5、添加圖片選擇的 onchange 方法:
export default { methods: { // 圖片壓縮前轉(zhuǎn)換 imgToBuffer(url) { return new Promise((resolve, reject) => { const xml = new XMLHttpRequest(); xml.open('GET', url, true); xml.responseType = 'blob'; xml.onload = function ({ currentTarget }) { //從事件對(duì)象結(jié)構(gòu)出currentTarget const { status, response } = currentTarget; status === 200 ? resolve(response) : reject(status); // response就是轉(zhuǎn)化后的 }; xml.send(); }); }, // 開(kāi)始?jí)嚎s uploadData(){ const zip = new JSZip(); const imgCache = {}; const imgArr = []; let list = [ {name: '測(cè)試圖片1', url: 'https://t7.baidu.com/it/u=1595072465,3644073269&fm=193&f=GIF'}, {name: '測(cè)試圖片2', url: 'https://t7.baidu.com/it/u=727460147,2222092211&fm=193&f=GIF'}, {name: '測(cè)試圖片3', url: 'https://t7.baidu.com/it/u=3911840071,2534614245&fm=193&f=GIF'}, {name: '測(cè)試圖片4', url: 'https://t7.baidu.com/it/u=938052523,709452322&fm=193&f=GIF'}, ]; list.forEach((item) => { // urlList格式:[{url:圖片鏈接,name:圖片名稱(chēng)}...] // 逐個(gè)添加文件 const promise = this.imgToBuffer(item.url).then((res) => { zip.file(`${item.name}.${res.type.split('/').pop()}`, res, { binary: true }); imgCache[item.name] = res; // 下載文件, 并存成ArrayBuffer對(duì)象(blob) }); imgArr.push(promise); }); Promise.all(imgArr).then(() => { zip.generateAsync({ type: 'blob' }).then((content) => { saveAs(content, '壓縮包名稱(chēng)'); // 打包壓縮 this.$message.success('壓縮完成'); }).catch((err) => { this.$message.error(err.message); }); }); } } }
至此完成壓縮下載!??!
總結(jié)
以上測(cè)試有效,感謝支持?。?!
這些僅為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Django+Vue實(shí)現(xiàn)WebSocket連接的示例代碼
這篇文章主要介紹了Django+Vue實(shí)現(xiàn)WebSocket連接的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05vue選項(xiàng)卡組件的實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了vue選項(xiàng)卡組件的實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03淺析vue-router實(shí)現(xiàn)原理及兩種模式
這篇文章主要介紹了vue-router實(shí)現(xiàn)原理及兩種模式分析,給大家介紹了vue-router hash模式與history模式不同模式下處理邏輯,需要的朋友可以參考下2020-02-02解決vue初始化項(xiàng)目時(shí),一直卡在Project description上的問(wèn)題
今天小編就為大家分享一篇解決vue初始化項(xiàng)目時(shí),一直卡在Project description上的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10vue.js 實(shí)現(xiàn)輸入框動(dòng)態(tài)添加功能
這篇文章主要介紹了vue.js 實(shí)現(xiàn)輸入框動(dòng)態(tài)添加功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06Element實(shí)現(xiàn)動(dòng)態(tài)增加多個(gè)輸入框并校驗(yàn)
本文主要介紹了Element實(shí)現(xiàn)動(dòng)態(tài)增加多個(gè)輸入框并校驗(yàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07在vue中nextTick用法及nextTick 的原理是什么
這篇文章主要介紹了在vue中nextTick用法及nextTick 的原理是什么,Vue.js 是一個(gè)流行的前端框架,它提供了一種響應(yīng)式的數(shù)據(jù)綁定機(jī)制,使得頁(yè)面的數(shù)據(jù)與頁(yè)面的 UI 組件之間能夠自動(dòng)同步,需要的朋友可以參考下2023-04-04