【发布时间】:2016-08-29 18:54:36
【问题描述】:
我正在考虑使用 JSZip 在来自各种下游文件的文件上创建一个 zip 文件。这是我正在尝试做的伪代码:
function* handler () {
const ids = this.request.body.ids;
const zip = new JSZip();
for (let i = 0; i < ids; i++) {
const r = yield request.get('/some/remote/service/' + ids[i]);
zip.file(ids[i], r.body);
}
this.body = zip.nodeStream():
}
但大概这将要求所有文件的内容一次在内存中,并且在所有文件下载之前不会开始流式传输。
我意识到我可以通过以下方式优化下载时间:
const allFiles = yield ids.map((id) => request.get('/some/remote/service/' + id));
for (let i = 0; i < ids.length; i++) zip.file(ids[i], allFiles[i]);
但主要是我希望有一种方法,一次只在内存中保存一个文件,并通过 zip 将结果流式传输回客户端。 JSZip 有可能吗?
【问题讨论】:
-
您是否尝试将文件流式传输到客户端下载的
.zip文件中? -
它比我在这里表示的要复杂一些,但基本上在服务器端,特定 id 后面可能有 N 个文件,客户端应该收到一个包含所有文件的 zip 文件。在后端数据存储中,它们没有预压缩,所以我会即时进行。
-
所以回答你的问题;是的,客户正在提供一个 id 并期待一个 zip 文件返回。
-
我不确定 ZIP 是否是一种流格式(您可以将数据连接到输出流),这将是您尝试做的要求。
标签: javascript node.js koa jszip