【发布时间】:2015-02-20 06:43:05
【问题描述】:
假设这样一种情况,使用一些javascript逻辑从一个小字符串生成一个大字符串,然后在浏览器上强制下载文本文件。
这可以通过将其作为 href 使用八位字节流下载来实现,如本答案所述:
Create a file in memory for user to download, not through server.
function download(filename, text) {
var pom = document.createElement('a');
pom.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
pom.setAttribute('download', filename);
pom.click();
}
但此解决方案需要在推送下载之前完全生成“文本”, 因此它必须完全保存在浏览器内存中。
是否可以在仅使用客户端逻辑生成文本时对其进行流式传输?
例如:
var inputString = "A";
var outStr = "";
for(var i = 0; i < 10000000 ; i++)
{
/* concatenate inputString to output on the go */
}
【问题讨论】:
-
如果您没有找到该问题的解决方案,可以将数据放入Blob,然后使用createObjectURL() 生成下载链接。浏览器可能会将数据缓存在磁盘上,尤其是您不会有大的数据 URL。
-
@Phillip 我不想将所有内容存储到 blob 或 zip 文件中,或者使用 indexDb ,流式传输是必需的。
-
没有。所有当前的浏览器技术都需要在发送第一个字节之前知道整体大小;只有像 node.js 这样较新的服务器端东西才能使用 http1.1 分块。您将不得不使用许多连接或缓冲区。您也许可以使用 websocket,但这需要在两端进行一些自定义。
标签: javascript