最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue將文件/圖片批量打包下載zip的教程

 更新時間:2020年10月21日 10:51:54   作者:紫月java  
這篇文章主要介紹了vue將文件/圖片批量打包下載zip的教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

vue將文件/圖片批量打包下載

各種格式都可以,只要url能夠打開或者下載文件即可.

1.通過文件的url,使用js的XMLHttpRequest獲取blob

2.將blob壓縮為zip

由于異步并行加載文件,速度還是蠻快的,我141個4M多的圖片,1分左右加載完成,49個4M的圖片4秒

添加依賴

//npm install jszip

//npm install file-saver

在頁面的script中引入依賴

import JSZip from 'jszip'

import FileSaver from 'file-saver'

代碼

  /**文件打包
  * arrImages:文件list:[{fileUrl:文件url,renameFileName:文件名}]
  * filename 壓縮包名
  * */
  filesToRar(arrImages, filename) {
  let _this = this;
  let zip = new JSZip();
  let cache = {};
  let promises = [];
  _this.title = '正在加載壓縮文件';
  for (let item of arrImages) {
   const promise= _this.getImgArrayBuffer(item.fileUrl).then(data => {
   // 下載文件, 并存成ArrayBuffer對象(blob)
   zip.file(item.renameFileName, data, { binary: true }); // 逐個添加文件
   cache[item.renameFileName] = data;
   });
   promises.push(promise);
  }
  Promise.all(promises).then(() => {
   zip.generateAsync({ type: "blob" }).then(content => {
   _this.title = '正在壓縮';
   // 生成二進制流
   FileSaver.saveAs(content, filename); // 利用file-saver保存文件 自定義文件名
   _this.title = '壓縮完成';
   });
  }).catch(res=>{
   _this.$message.error('文件壓縮失敗');
  });
  },
 //獲取文件blob
  getImgArrayBuffer(url){
  let _this=this;
  return new Promise((resolve, reject) => {
   //通過請求獲取文件blob格式
   let xmlhttp = new XMLHttpRequest();
   xmlhttp.open("GET", url, true);
   xmlhttp.responseType = "blob";
   xmlhttp.onload = function () {
   if (this.status == 200) {
    resolve(this.response);
   }else{
    reject(this.status);
   }
   }
   xmlhttp.send();
  });
  },

補充知識:vue 生成二維碼并且批量打包下載代碼

我就廢話不多說了,大家還是直接看代碼吧~

<template>
	<div>
		<div v-show="codeId" ref="QrcodePage" style="z-index:-1111;position:absolute;left:-99999;width: 450px;height: 475px;background-size: cover;">
			<div id="qrCode" v-if="codeId">
				<QrcodeVue :logoSrc="imageUrl" :key="random" :callback="texte" :text="codeValue" :logoScale="50" :size="750"></QrcodeVue>
				<p style="text-align: center; font-size: 1.5625rem;">{{ codeNumber }}</p>
			</div>
		</div>
	</div>
</template>
<script>
let loadingInstance = '';
import QrcodeVue from 'vue-qr';
import html2canvas from 'html2canvas';
import JSZip from 'jszip';
import FileSaver from 'file-saver';
export default {
	name: 'qrcode',
	components: {
		QrcodeVue
	},
	data() {
		return {
			random: '1',
			codeId: '',
			qrcodeUrl: '',
			imageUrl: '',
			// imageUrl: 'https://shop.mmdddd.com/workShopWeb/static/img/72.png',//logo
			qrContentImage: '',
			codeValue: '',
			initCodeVal: 'http://xcx.nmte.net/tips/index.html',
			codeNumber: '',
			arr: [],
			qrcodeArr: [],
			index: 0
		};
	},
	watch: {
		index(newName, oldName){
			if(newName != oldName && newName <= this.arr.length-1){
				setTimeout(_ => {
					this.setarr(this.arr);
				}, 0);
			}else {
				this.$nextTick(_ => {
					loadingInstance.close();
				});
			}
		}
	},
	created() {
	},
	mounted() {},
	methods: {
		texte(url,qid) {
			setTimeout(_ => {
				this.createImgs();
			}, 100);
		},
		setarr(arr) {
			this.arr = arr;
			if(this.index > this.arr.length -1) {
				this.index = 0;
			}
			let index=this.index||0;
			loadingInstance = this.$Loading.service({
				lock: true, 
				text: '二維碼碼批量下載中,請稍后...', 
				spinner: 'el-icon-loading', 
				background: 'rgba(0, 0, 0, 0.7)'
			});
			this.codeNumber = this.arr[index].codeNumber; 
			this.arr[index].codeId ? (this.codeId = this.arr[index].codeId) : this.$Message.warn('獲取信息失敗,請刷新重試');
			this.codeValue = this.initCodeVal + '?codeId=' + this.arr[index].codeId + '&codeNumber=' + this.arr[index].codeNumber;
			this.random = Math.random(); 
		},
		createImgs() {
			var that = this;
			if(that.index <= that.arr.length -1 && that.codeId){
				let shareContent = that.$refs.QrcodePage, 
					width = shareContent.offsetWidth, 
					height = shareContent.offsetHeight,
					canvas = document.createElement('canvas'), 
					scale = 1; 
				canvas.width = width * scale; 
				canvas.height = height * scale; 
				canvas.style.width = (shareContent.clientWidth * scale) / 100 + 'rem';
				canvas.style.height = (shareContent.clientHeight * scale) / 100 + 'rem';
				canvas.getContext('2d').scale(scale, scale); 
				let opts = {
					scale: scale, 
					canvas: canvas,
					logging: false,
					width: width, 
					height: height,
					useCORS: true
				};
				html2canvas(shareContent, opts)
					.then(function(canvas) {	
						const qrContentImage = canvas.toDataURL('image/jpeg', 1.0);
						if(that.index <= that.arr.length -1 && that.codeId){
							that.qrcodeArr.push({
								url: qrContentImage,
								name: that.arr[that.index].codeNumber
							});
						}
						if(that.codeId){
							that.index ++;
						}
						if(that.qrcodeArr.length == that.arr.length){
							that.packageImages();
							that.codeId = null;
						}
					})
					.catch(function(reason) {
						console.log(reason);
					});
			}
		},
		packageImages() {
			let that = this;
			const zip = new JSZip();
			const cache = {};
			setTimeout(_ => {
				let arr = that.qrcodeArr;
				arr.forEach((item,index)=>{
					let fileName = item.name;
					zip.file(fileName + '.png',item.url.substring(22),{base64:true})
					cache[fileName] = item.url
				})
				zip.generateAsync({type:"blob"}).then(content => { 
					FileSaver.saveAs(content, "二維碼.zip") 
				})
			},0)
		}
	}
};
</script>
<style lang="less" scoped="scoped">
#qrCode {
	width: 375px;
	height: 375px;
	position: absolute;
	top: 52%;
	left: 50%;
	transform: translate(-50%, -50%);
	img {
		display: block;
		width: 100%;
		height: 100%;
	}
}
</style>

調(diào)用setarr傳數(shù)組

以上這篇vue將文件/圖片批量打包下載zip的教程就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • vue+bpmn.js實現(xiàn)自定義流程圖的完整代碼

    vue+bpmn.js實現(xiàn)自定義流程圖的完整代碼

    這篇文章主要介紹了vue+bpmn.js實現(xiàn)自定義流程圖的完整代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借價值,需要的朋友參考下吧
    2024-03-03
  • Vue3實現(xiàn)全局loading指令的示例詳解

    Vue3實現(xiàn)全局loading指令的示例詳解

    這篇文章主要介紹了Vue3實現(xiàn)全局loading指令,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • vue如何獲取配置代理文件中的api地址值

    vue如何獲取配置代理文件中的api地址值

    這篇文章主要介紹了vue如何獲取配置代理文件中的api地址值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 關于element-ui中el-form自定義驗證(調(diào)用后端接口)

    關于element-ui中el-form自定義驗證(調(diào)用后端接口)

    這篇文章主要介紹了關于element-ui中el-form自定義驗證(調(diào)用后端接口),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • vite5+vue3+?import.meta.glob動態(tài)導入vue組件圖文教程

    vite5+vue3+?import.meta.glob動態(tài)導入vue組件圖文教程

    import.meta.glob是Vite提供的一個特殊功能,它允許你在模塊范圍內(nèi)動態(tài)地導入多個模塊,這篇文章主要給大家介紹了關于vite5+vue3+?import.meta.glob動態(tài)導入vue組件的相關資料,需要的朋友可以參考下
    2024-07-07
  • Vue?package-lock.json的作用及說明

    Vue?package-lock.json的作用及說明

    這篇文章主要介紹了Vue?package-lock.json的作用及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Vue3中defineEmits、defineProps?不用引入便直接用

    Vue3中defineEmits、defineProps?不用引入便直接用

    這篇文章主要介紹了Vue3中defineEmits、defineProps?不用引入便直接用,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • vue-router中關于meta的作用及說明

    vue-router中關于meta的作用及說明

    這篇文章主要介紹了vue-router中關于meta的作用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • vue日歷/日程提醒/html5本地緩存功能

    vue日歷/日程提醒/html5本地緩存功能

    這篇文章主要介紹了vue日歷/日程提醒/html5本地緩存功能,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • Vue組合式API如何正確解構(gòu)props不會丟失響應性

    Vue組合式API如何正確解構(gòu)props不會丟失響應性

    響應式?API?賦予了組合式?API?一大坨可能性的同時,代碼精簡,雖然但是,我們應該意識到響應性的某些陷阱,比如丟失響應性,在本文中,我們將學習如何正確解構(gòu)?Vue?組件的?props,使得?props?不會丟失響應性
    2024-01-01

最新評論

上饶县| 公安县| 新野县| 南漳县| 洪泽县| 杭锦后旗| 定边县| 榕江县| 汤阴县| 青州市| 甘德县| 庐江县| 金坛市| 临武县| 孙吴县| 夏河县| 香港| 涡阳县| 合水县| 和平区| 龙泉市| 玉山县| 宁津县| 聂荣县| 永德县| 葵青区| 岚皋县| 托克逊县| 临汾市| 西城区| 图木舒克市| 平阳县| 武冈市| 盐亭县| 临夏县| 黔江区| 开封县| 漳浦县| 大安市| 彰武县| 夹江县|