让我们假设这样一种情况,即使用一些javascript逻辑从一个小字符串生成一个巨大的字符串,然后强制在浏览器上下载该文本文件.
这可以通过将其作为href使用八位字节流下载来实现,如本答案中所述:
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();
}
Run Code Online (Sandbox Code Playgroud)
但是这个解决方案要求在推送下载之前完全生成"文本",因此它必须完全保存在浏览器内存中.
是否可以在使用CLIENT SIDE LOGIC生成文本时对其进行流式传输?
例如 :
var inputString = "A";
var outStr = "";
for(var i = 0; i < 10000000 ; i++)
{
/* concatenate inputString to output on the go */
}
Run Code Online (Sandbox Code Playgroud)
是和否.不,因为没有办法只使用客户端javascript写入文件.均田.您可以提示用户下载并保存文件,但正如您所提到的,代码必须在下载发生之前生成整个文件.注意:通过"流"我假设您的意思是流到文件(不断写入文件)和"仅限客户端逻辑"我假设您在浏览器中的意思.
看起来Mozilla一直致力于让客户端代码与文件进行交互.这是肯定的.的种类.它们有自己的文件系统api,可以让您与本地机器文件系统进行交互(写入).具体来说,有一个函数可以让您将输入流写入文件.但是,有一些星号:
1)看起来整个系统都被弃用了; 他们鼓励开发人员在文件I/O 上使用OS.file
2)你必须使用XPConnect一个允许你XPCOM在javascript中访问Mozilla (组件库)的系统.如果你想在浏览器中这样做,看起来只有firefox扩展具有与这些组件交互的适当权限().如果你不想在浏览器中这样做,你显然可以使用node.
可以肯定的是,在实施过程中必然会出现更多的并发症.但这看起来是最有把握的前进路径,因为它可以OS.File让您访问像OS.File.writeAtomic()&basic write to file这样的函数
话虽如此,它并不是一条很棒的道路,但希望这能给你一个坚实的起点.正如@dandavis所提到的,浏览器(即"客户端逻辑")被设计为不允许这种事情.如果一个网站可以与任何用户的本地文件系统进行交互,那将是一个非常巨大的疏忽/安全漏洞.
其他资源:
XPConnect
上的维基百科关于在javascript中使用XPCOM的指南 - 可能没那么有用
| 归档时间: |
|
| 查看次数: |
758 次 |
| 最近记录: |