最近项目开发用到压缩插件JSZip,因为用户上传的文件数量是不固定的,所以需要动态追加文件去压缩。
错误的使用:
1、直接对象和字符串拼接
var aa = "";
for(var i = 0; i < _this.forZipFile.length; i++){
aa += ".file(_this.forZipFile[" + i + "].name, _this.forZipFile["+ i+ "])"
}
console.log("aa", aa); //可以获取到拼接好的字符串 file(_this.forZipFile[0].name, _this.forZipFile[0]).file(_this.forZipFile[1].name, _this.forZipFile[1]) ......
var zip = new JSZip();
zip.folder("media") + aa; //结果会是"[object,object].file(_this.forZipFile[0].name, _this.forZipFile[0])..."
//打包出来是空文件夹
2、对象转字符串,再用eval
var aa = "";
for(var i = 0; i < _this.forZipFile.length; i++){
aa += ".file(_this.forZipFile[" + i + "].name, _this.forZipFile["+ i+ "])"
}
console.log("aa", aa); //可以获取到拼接好的字符串 file(_this.forZipFile[0].name, _this.forZipFile[0]).file(_this.forZipFile[1].name, _this.forZipFile[1]) ......
var zip = new JSZip();
var tt = JSON.stringify(zip.folder("media"));
console.log(tt + aa);
eval(tt + aa);
解决方法
1、死板的方法
if(_this.forZipFile.length == 2){
zip.folder("media").file(_this.forZipFile[0].name, _this.forZipFile[0]).file(_this.forZipFile[1].name, _this.forZipFile[1])
}else if(_this.forZipFile.length == 3){
zip.folder("media").file(_this.forZipFile[0].name, _this.forZipFile[0]).file(_this.forZipFile[1].name, _this.forZipFile[1]).file(_this.forZipFile[2].name, _this.forZipFile[2])
}else if......
2、使用递归函数
var bb = 0;
function aa(zip){
if(bb < _this.forZipFile.length){
zip.file(_this.forZipFile[bb].name, _this.forZipFile[bb]);
bb++;
return aa(zip);
}
var zip = new JSZip();
aa(zip.folder("media"))