我可以使用 JavaScript 在本地创建和保存一个巨大的文件吗?

4
我希望使用JavaScript在客户端创建和保存大型的 .csv 文件。此前已经有人提出并解答了这个问题(参见例如 1234)。针对该问题,有两种方法可供选择(当然还有其他方法)。
  1. Use FileSaver.js to implement w3c’s saveAs():

    var lines = ["line 1,cell 11,cell 12\n","line 2,cell 21,cell 22\n"];
    var type = "text/csv;charset=utf-8";
    var blob = new Blob(lines,{"type":type});
    saveAs(blob,"download.csv");
    
  2. Use a[download] and a data uri:

    var lines = ["line 1,cell 11,cell 12\n","line 2,cell 21,cell 22\n"];
    var type = "text/csv;charset=utf-8";
    var downloader = $('<a download href="data:'+type+','+escape(lines.join(''))+'"></a>')
        .appendTo("body")
    downloader[0].click();
    downloader.remove();
    
我的问题是我的文件可能非常庞大:1800万行和2.5GB(我希望能够处理更多)。使用“lines”会占用太多内存并导致网站崩溃。但是没有必要将“lines”存储在浏览器的内存中,只为了将其保存到硬盘驱动器中。是否有一种方法可以使用JavaScript创建渐进式下载(换句话说,开始下载但在计算它们时保持添加行)?或者我的唯一选择是将文件作为单独的块下载,用户必须将它们连接起来?

虽然这个问题很好写并且结构合理,但我认为可能的答案会偏向于主观见解。 - Jonast92
3
如果我的问题是“我哪种方法更好”,那么我同意这太基于个人意见了。但我的问题是“我想做的事情是否可能”,这似乎不是基于个人意见的(在我看来)。 - Teepeemm
我理解。也许最好的解决方案就是尝试两种方法,并通过查看一些基准测试来确定哪个更适合,然后你就会知道答案,至少对于你的情况如此,并且你可以与全世界分享!:)——虽然我理解你想节省时间而等待回答,但你可能不应该指望它。 - Jonast92
2
@Jonast92 我不确定你是否理解我的意思。我已经尝试了两种方法。Google Chrome报告称,该选项卡的内存达到了1.5 Gb,CPU为135-140(不管那是什么意思),而选项卡崩溃了,可能是因为lines太大了。因此,我希望将文件保存到硬盘上,而不必在javascript的内存中创建整个对象。类似于“blob=new Blob(); saveAs(blob); blob.append(lines);”的顺序。 - Teepeemm
1个回答

0
如果您正在使用HTML5,可以尝试使用FileSytem API。请参阅此处以获取有关该主题的信息,以及此处以获取有关如何在客户端创建和访问文件的更实际示例。

我确实在使用HTML5。感谢提供的链接,html5rocks似乎提供了更多的示例。不幸的是,FileSystem已经被停用,我预计这种方法的支持将来只会减少。 - Teepeemm
FileSystem API并没有完全的支持,只有Chrome、Opera和一些移动浏览器支持它(基本上是基于Webkit的浏览器)。由于你的应用程序相当不常见,我认为这个建议可能适合你,并且浏览器支持可能在你的列表中排名第二,紧随客户端生成这些大文件之后。 - imelgrat
文件系统已经被停用,但他们不太可能将其删除。太多的网络应用程序依赖于它,甚至Chrome扩展程序也在使用它。 - Endless

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接