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>

调用setarr传数组

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

以上是 vue将文件/图片批量打包下载zip的教程 的全部内容, 来源链接: utcz.com/p/218266.html

回到顶部