假设我有一个在客户端生成的大文件,我希望允许用户将其保存到他们的硬盘上。
通常的方法是创建一个 Blob,然后为其创建一个对象 URL:
const blob = new Blob([chunks], {type: 'application/example'});
linkEl.href = URL.createObjectUrl(blob);
这可行,但效率不高,因为它可以快速耗尽所有可用内存,因为生成的文件必须保留在内存中。
更好的方法将启用流式传输。像这样的东西:
const outputStream = new WritableStream();
linkEl.href = URL.createObjectUrl(outputStream);
while (let chunk = await getChunk()) {
outputStream.write();
}
outputStream.end();
今天有直接的方法吗?
我见过的流式传输的唯一方法是使用 Service Worker。不幸的是,在许多情况下 Service Worker 不可用。隐私模式可能会绕过所有服务人员。硬刷新页面会禁用它们。打开浏览器工具可以重置 service worker 状态。工人可以随时被杀死,并且不能保证通过消息传递使其保持活力。所有这些 hack 都在这里的一个优秀项目中实现: https ://github.com/jimmywarting/StreamSaver.js 但是,归根结底,由于这些浏览器的限制,它是不可靠的。
是否存在用于在不使用服务工作者的情况下流式传输“下载”客户端的适当 API?