为什么以下javascript代码段会产生一个空的zip存档?

时间:2013-05-01 07:34:06

标签: javascript zip

以下代码段使用zip.js创建zip存档,ZippyMcZip.zip或内容中的字符串。 contents是一个值数组。 e.g。

{name:"my name",contents:"contents to write to file."}

正在创建存档,但是除了清单之外它是空的:

$ unzip -l ZippyMcZip.zip
Archive:  ZippyMcZip.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
        0  05-01-13 16:41   File1.txt
        0  05-01-13 16:41   File2.txt
 --------                   -------
        0                   2 files

有没有人有关于存档为什么包含空文件的指示?

saveAs FileSaver.js提供,我不认为这是一个问题,因为该文件正在写入HD并在其他地方使用。

function createZip(contents) {      

function onProgress(a,b) {
    console.log("current",a, "end",b);
  }            

function onEnd() {
    console.log("on End");
  }            

  zip.workerScriptsPath = "/js/zip/";
  zip.useWebWorkers = false;

  var zipper = (function() {

    var zipWriter;

    return {

      addTexts: function(files) {

          function add(text) {
            zipWriter.add(text.name,
                     new zip.TextReader(text.contents),onEnd,onProgress);
          }

          zip.createWriter(new zip.BlobWriter(), function(writr) {
            zipWriter = writr;
          });              

          _.foreach(files, add);

      },
      getBlob: function(callback) {
        zipWriter.close(callback);
      }
    };
  })();

  zipper.addTexts(contents);
  zipper.getBlob(function(blob) { 
    saveAs(blob, "ZippyMcZip.zip"); 
  });
}

1 个答案:

答案 0 :(得分:0)

您有两个与zip.js API的异步性质相关的问题。

首先,您尝试并行编写多个文件:它不起作用。因此,您不必使用同步_.foreach函数进行迭代,而是必须在add方法的onEnd回调中递归调用zipWriter.add函数(参见[1]} )。

然后,您还必须等待在调用zipWriter.close方法之前编写此内容,因此您必须在签名中定义callback参数(参见[2]addTexts方法。在递归过程完成时调用它。

以下是包含以下2个修补程序的代码:

function createZip(contents) {

  function onProgress(a, b) {
    console.log("current", a, "end", b);
  }

  zip.workerScriptsPath = "/js/zip/";
  zip.useWebWorkers = false;

  var zipper = (function() {

    var zipWriter;

    return {
      addTexts : function(files, callback /* [2] new parameter */) {

        function add(fileIndex) {
          if (fileIndex < files.length) {
            zipWriter.add(files[fileIndex].name, 
                new zip.TextReader(files[fileIndex].contents), function() {
              add(fileIndex + 1); /* [1] add the next file */
            }, onProgress);
          } else {
            callback() /* [2] no more files to add: callback is called */;
          }
        }

        zip.createWriter(new zip.BlobWriter(), function(writer) {
          zipWriter = writer;
          add(0); /* [1] add the first file */
        });
      },
      getBlob : function(callback) {
        zipWriter.close(callback);
      }
    };
  })();

  zipper.addTexts(contents, function() {
    zipper.getBlob(function(blob) {
      saveAs(blob, "ZippyMcZip.zip"); 
    });
  });  
}