【发布时间】: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