Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将JSZip和JSZipUtils与AngularJS一起使用以压缩多个图像文件时,zip文件为空_Javascript_Angularjs_Image_Zip_Jszip - Fatal编程技术网

Javascript 将JSZip和JSZipUtils与AngularJS一起使用以压缩多个图像文件时,zip文件为空

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

我正在尝试使用JSZip和JSZipUtils以及AngularJS将多个图像文件压缩在一起。我对AngularJS还是相当陌生的,所以我确信我已经把过程复杂化了。请容忍我

        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;
    }