【问题标题】:Why is it taking so long to download a zip file through AJAX?为什么通过 AJAX 下载 zip 文件需要这么长时间?
【发布时间】:2018-09-20 09:01:34
【问题描述】:

在我的网页上,有一个功能可以让用户下载 zip 文件。它的工作方式是用户单击下载按钮后,将向 api 发送 GET 请求,然后服务器将文件数据作为 arraybuffer 发送回。然后 UI 将数据转换为 blob 对象并将其保存为 zip 文件。这是示例代码:

function download(){

    var req = {
      method: 'GET',
      url: "api/download",
      contentType: "application/zip",
      responseType: "arraybuffer",
      headers: {"Accept": "application/zip"}
    };

    $http(req).then(function (res) {
        if(res.status === 200){
           var file = new Blob([res.data], { type: "application/zip" });
           var link = document.createElement('a');
           link.href = URL.createObjectURL(file);
           link.download = "MyFile.zip";
           document.body.appendChild(link);
           link.click();
           document.body.removeChild(link);
        }
    }, function (err) {});

}

代码运行良好,除了一个问题:整个过程似乎需要很长时间才能完成。即使对于只有 100kb 的 zip 文件,下载仍然需要至少 2 分钟。当我检查开发工具时,我注意到数据传输过程在大约 3-5 秒内完成,然后程序就像在继续下一步之前又停止了 2 分钟一样。 (同时开发工具不断显示请求仍在进行中)。让它看起来更奇怪的是,我有一些不同大小的测试文件,比如从 100KB 到 150MB,下载时间大致相同(相差不到 5 秒)。

有人可以详细说明可能是什么原因,我该如何改善?或者是否有更好的方法通过不同的工作流程/模型来实现目标?

提前谢谢你!

【问题讨论】:

  • 几个问题。您是否尝试过逐行注释掉代码以识别时间繁重的命令?您是否也尝试过在不创建 Blob 的情况下执行此操作?我已经使用返回 pdf 的端点完成了类似的操作,而不必创建 blob iirc。
  • @Taplar 我怀疑这可能与 Blob 有关。但我不知道如何在不使用 Blob 的情况下从 arraybuffer 获取 zip 文件。我也用 Bolb 完成了 pdf 和 csv 文件,但之前没有一个有这样的问题,甚至一些 pdf 文件超过 50mb,下载时间似乎是一致的。我想最让我困惑的是,转换 100kb 文件和 100mb 文件所需的时间相同?
  • 我会在下面思考 Yserbius 的回答。我会假设一个更好的方法是让服务器以它已经预期的格式返回文件,而不是在 javascript 中转换它,所以你所要做的就是创建对象 url 并让他们下载它。
  • 您可以将 responseType 设置为 'blob',这样您就不必创建 Blob 并占用额外的内存

标签: javascript jquery ajax blob


【解决方案1】:

问题似乎是您通过 Blob 将 ZIP 文件临时存储在客户端浏览器内存中,该文件被存储在其中 两次(一次作为结果数据,一次作为 Blob)。如果您只是让服务器生成 zip 作为临时文件并向客户端发送指向该文件的链接,这看起来会更好。

【讨论】:

  • 感谢您的建议。不幸的是,我目前无法控制服务器端代码,所以我暂时需要在 UI 上找出一些东西。你知道是否有一种方法可以不使用 Blob 将 arraybuffer 数据转换为 zip 文件吗?
  • 为什么不直接创建一个指向文件本身 URL 的链接?
  • 因为没有文件的 URL。服务器动态创建了文件,而不是将其存储在服务器上的某个位置,它只是将二进制数据发送回 UI,因此文件必须在客户现场组装。
猜你喜欢
  • 2011-11-12
  • 2012-08-09
  • 2015-05-13
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多