6

我正在尝试使用 jsZip 创建一个 zip 文件。zip 文件的内容是来自网络的图像。我创建了以下代码。但是当我运行它时,得到的是一个 22kb 的空 zip 文件。

<html>
<body>
  <script type="text/javascript" src="jszip.js"></script>
  <script type="text/javascript" src="FileSaver.js"></script>
  <script type="text/javascript" src="jszip-utils.min.js"></script>
  <script>
    var imgLinks = ["url1", "url2", "url3"];

    function create_zip() {
      var zip = new JSZip();
      for (var i = 0; i < imgLinks.length; i++) {
        JSZipUtils.getBinaryContent(imgLinks[i], function(err, data) {
          if (err) {
            alert("Problem happened when download img: " + imgLink[i]);
            console.erro("Problem happened when download img: " + imgLink[i]);
            deferred.resolve(zip); // ignore this error: just logging
            // deferred.reject(zip); // or we may fail the download
          } else {
            zip.file("picture" + i + ".jpg", data, {
              binary: true
            });
            deferred.resolve(zip);
          }
        });
      }
      var content = zip.generate({
        type: "blob"
      });
      saveAs(content, "downloadImages.zip");
    }
  </script>
  <br/>
  <br/>
  <center>
    Click the button to generate a ZIP file
    <br/>
    <input id="button" type="button" onclick="create_zip()" value="Create Zip" />
  </center>
</body>
</html>

(url1、url2 和 url3 替换为我要下载的图片 url)。

为什么我得到这些空的 zip 文件?

4

1 回答 1

6

JSZipUtils.getBinaryContent是异步的:内容会在调用之后zip.generate()添加。在生成 zip 文件之前,您应该等待所有图像。

编辑 :

如果您正在加载的文件位于不同的服务器上,则该服务器需要发送额外的 HTTP 标头,例如Access-Control-Allow-Origin: server-hosting-the-page.com. 在这种情况下,Firefox 或 Chrome 调试控制台将显示错误。js 库无法检测到CORS问题(请参阅此处),并且会以空内容触发成功。

于 2015-01-02T23:48:02.673 回答