vue将文件/图片批量打包下载zip的教程


Posted in Javascript onOctober 21, 2020

vue将文件/图片批量打包下载

各种格式都可以,只要url能够打开或者下载文件即可.

1.通过文件的url,使用js的XMLHttpRequest获取blob

2.将blob压缩为zip

由于异步并行加载文件,速度还是蛮快的,我141个4M多的图片,1分左右加载完成,49个4M的图片4秒

vue将文件/图片批量打包下载zip的教程

vue将文件/图片批量打包下载zip的教程

添加依赖

//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>

调用setarr传数组

以上这篇vue将文件/图片批量打包下载zip的教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript数组去重3种方法的性能测试与比较
Mar 26 Javascript
jquery 简单应用示例总结
Aug 09 Javascript
JavaScript字符串对象slice方法入门实例(用于字符串截取)
Oct 16 Javascript
JavaScript实现在页面间传值的方法
Apr 07 Javascript
利用python分析access日志的方法
Oct 26 Javascript
Jquery实现跨域异步上传文件总结
Feb 03 Javascript
DVA框架统一处理所有页面的loading状态
Aug 25 Javascript
利用js实现前后台传送Json的示例代码
Mar 29 Javascript
详解ES6中的三种异步解决方案
Jun 28 Javascript
vue配置文件实现代理v2版本的方法
Jun 21 Javascript
JS实现扫码枪扫描二维码功能
Jan 03 Javascript
在实例中重学JavaScript事件循环
Dec 03 Javascript
uniapp实现可滑动选项卡
Oct 21 #Javascript
element中table高度自适应的实现
Oct 21 #Javascript
vue+springboot+element+vue-resource实现文件上传教程
Oct 21 #Javascript
原生小程序封装跑马灯效果
Oct 21 #Javascript
uniapp实现横向滚动选择日期
Oct 21 #Javascript
实现vuex原理的示例
Oct 21 #Javascript
详解JavaScript类型判断的四种方法
Oct 21 #Javascript
You might like
php 使用GD库为页面增加水印示例代码
2014/03/24 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
2017/07/27 PHP
SyntaxHighlighter代码加色使用方法
2008/09/07 Javascript
JavaScript 设计模式 安全沙箱模式
2010/09/24 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
js/jquery去掉空格,回车,换行示例代码
2013/11/05 Javascript
JavaScript的strict模式与with关键字介绍
2014/02/08 Javascript
javascript模拟订火车票和退票示例
2014/04/24 Javascript
JavaScript实现防止网页被嵌入Frame框架的代码分享
2014/12/29 Javascript
javascript的 {} 语句块详解
2016/02/27 Javascript
Google 地图控件集详解及实例代码
2016/08/06 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
javascript之IE版本检测超简单方法
2016/08/20 Javascript
AngularJS的Filter的示例详解
2017/03/07 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
Vue-cli 使用json server在本地模拟请求数据的示例代码
2017/11/02 Javascript
使用Angular Cli如何创建Angular私有库详解
2019/01/30 Javascript
ios中视频的最后一桢问题解决
2019/05/14 Javascript
js 根据对象数组中的属性进行排序实现代码
2019/09/12 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
2020/10/02 Javascript
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
python psutil库安装教程
2018/03/19 Python
python实现事件驱动
2018/11/21 Python
春节到了 教你使用python来抢票回家
2020/01/06 Python
matlab灰度图像调整及imadjust函数的用法详解
2020/02/27 Python
python绘制玫瑰的实现代码
2020/03/02 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
2020/03/23 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
关于HTML5的安全问题开发人员需要牢记的
2012/06/21 HTML / CSS
翻新二手苹果产品的网络领导者:Mac of all Trades
2017/12/19 全球购物
大学生村官工作感言
2014/01/10 职场文书
网上卖盒饭创业计划书范文
2014/02/07 职场文书
看完这篇文章获得一些java if优化技巧
2021/07/15 Java/Android
 python中的元类metaclass详情
2022/05/30 Python