Javascript 将JSZip和JSZipUtils与AngularJS一起使用以压缩多个图像文件时,zip文件为空
我正在尝试使用JSZip和JSZipUtils以及AngularJS将多个图像文件压缩在一起。我对AngularJS还是相当陌生的,所以我确信我已经把过程复杂化了。请容忍我Javascript 将JSZip和JSZipUtils与AngularJS一起使用以压缩多个图像文件时,zip文件为空,javascript,angularjs,image,zip,jszip,Javascript,Angularjs,Image,Zip,Jszip,我正在尝试使用JSZip和JSZipUtils以及AngularJS将多个图像文件压缩在一起。我对AngularJS还是相当陌生的,所以我确信我已经把过程复杂化了。请容忍我 vm.downloadDaughterZip = function (){ var zip = new JSZip(); vm.getBinaryContents(zip).then(function(result){ vm.getZipImag
vm.downloadDaughterZip = function (){
var zip = new JSZip();
vm.getBinaryContents(zip).then(function(result){
vm.getZipImageFiles(result).then(function(data){
saveAs(data, "daughters.zip");
});
});
}
vm.getBinaryContents = function (zip) {
var deferred = $q.defer();
deferred.resolve(vm.getBinCont(zip, deferred));
return deferred.promise;
}
vm.getBinCont = function (zip, deferred) {
angular.forEach(vm.selectedDaughtersList, function (value, key){
var tempPathArray = value.value.split('/');
var filename = tempPathArray[tempPathArray.length -1];
vm.getSingleBinaryContentCall(zip, value, filename, deferred);
});
return zip;
}
vm.getSingleBinaryContentCall = function (zip, value, filename, deferred) {
deferred.resolve(vm.getSingleBinCont(zip, value, filename));
return deferred.promise;
}
vm.getSingleBinCont = function (zip, value, filename) {
JSZipUtils.getBinaryContent(value.value, function (err, data){
if(err){
alert("some error");
}
else{
zip.file(filename, data, {binary:true, compression : "DEFLATE"});
}
});
return zip;
}
vm.getZipImageFiles = function (zip) {
var deferred = $q.defer();
deferred.resolve(vm.getImagesForZip(zip));
return deferred.promise;
}
vm.getImagesForZip = function (zip) {
console.log(zip);
return zip.generate({type:"blob"});
}
我正在尝试使用Promissions来处理所有事情,以确保在尝试运行zip.generate之前,JSZipUtils.getBinaryContent正在处理文件,然后在使用saveAs之前确保它正在处理zip.generate
好消息是,在我执行底部的generate之前,当我查看zip的控制台日志时,它似乎显示了正确的结构,包括图像文件数据(出于某种原因,它被存储为Uint8Array类型)。但是,当我运行generate并将其返回到saveAs调用的流时,它生成的zip文件是空的。当我对底部的zip.generate生成的blob文件执行console.log操作时,它似乎没有数据(只有22字节大)
我的假设是,要么是JSZipUtils.getBinaryContent生成的图像文件格式错误,要么是zip.generate没有正确处理它,要么是我仍然存在某种计时问题。另一方面需要注意的是,图像与代码存储在同一台服务器上,因此我不必担心跨站点问题。非常感谢您的反馈
解决了
因此,我查看了JSZip页面上的一个示例,并以它们的源代码为例进行了清理。我把事情搞得太复杂了,所以看起来有点时间问题。以下是我现在拥有的工作代码:
vm.downloadDaughterZip = function (){
var zip = new JSZip();
var deferreds = [];
angular.forEach(vm.selectedDaughtersList, function (value, key){
var tempPathArray = value.value.split('/');
var filename = tempPathArray[tempPathArray.length -1];
deferreds.push(vm.getSingleBinCont(zip, value, filename));
});
$.when.apply($, deferreds).done(function () {
var blob = zip.generate({type:"blob"});
saveAs(blob, "daughters.zip");
});
}
vm.getSingleBinCont = function (zip, value, filename) {
var deferred = $.Deferred();
JSZipUtils.getBinaryContent(value.value, function (err, data){
if(err){
deferred.reject(err);
}
else{
zip.file(filename, data, {binary:true});
deferred.resolve(data);
}
});
return deferred;
}