使用 jsZip 将 url 中的图像添加到 zip 文件

Adding images from url to a zip file using jsZip

我正在尝试使用 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 文件?

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

编辑:

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