首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用FileAPI下载大生成的数据文件

使用FileAPI下载大生成的数据文件
EN

Stack Overflow用户
提问于 2013-05-13 13:11:47
回答 2查看 993关注 0票数 8

JavaScript进程生成大量数据(200-300MB)。我想保存这些数据以供进一步分析,但到目前为止我发现的最佳方法是使用这个示例http://jsfiddle.net/c2U2T/进行保存,这对我来说不是一个选项,因为它似乎需要在开始下载之前提供所有可用的数据。但我需要的是

代码语言:javascript
复制
var saver = new Saver();
saver.save(); // The Save As ... dialog appears
saver.onaccepted = function () { // user accepted saving
    for (var i = 0; i < 1000000; i++) {
        saver.write(Math.random());
    }
};

当然,Math.random()将是一些有意义的构造。

EN

回答 2

Stack Overflow用户

发布于 2013-05-13 13:51:22

你真正想做的是一种流。我的意思是FileAPI不适合这项任务。相反,我可以提出两种选择:

第一种方法是使用XHR工具,即ajax,将数据分割成几个块,然后依次发送到服务器,请求中的每个块连同一个id (用于标识流)和一个位置索引(用于标识块位置)。我不建议这样做,因为它增加了分解和重新组装数据的工作,而且还有更好的解决方案。

实现这一点的第二种方法是使用Websocket。它允许您在生成数据时按顺序向服务器发送数据。遵循通常的流API。我觉得你绝对需要这个。

这个页面可能是一个很好的起点:http://binaryjs.com/

全是这些人!

考虑到您的评论,编辑:

不过,我不能完全理解您的观点,但是,HTML5 5的FileSystem API呢?

这里有几个例子:http://www.html5rocks.com/en/tutorials/file/filesystem/,其中这个示例允许您将数据附加到一个存在的文件中。您还可以创建一个新文件,等等:

代码语言:javascript
复制
function onInitFs(fs) {

  fs.root.getFile('log.txt', {create: false}, function(fileEntry) {

    // Create a FileWriter object for our FileEntry (log.txt).
    fileEntry.createWriter(function(fileWriter) {

      fileWriter.seek(fileWriter.length); // Start write position at EOF.

      // Create a new Blob and write it to log.txt.
      var blob = new Blob(['Hello World'], {type: 'text/plain'});

      fileWriter.write(blob);

    }, errorHandler);

  }, errorHandler);

}

编辑2 :

正如在SO 这里上所说的,使用javascript是不可能的。尽管如此,Tha作者还是建议使用Java来实现所需的行为。

简单地说,HTML5文件系统API只提供一个沙箱文件系统(位于浏览器的某个隐藏目录中)。因此,如果您想访问真正的文件系统,考虑到您的用例,使用java就更好了。我猜java和javascript 这里之间有一个接口。但是,如果您想使您的数据只能从浏览器(受相同来源策略约束)可用,请使用FileSystem API。

票数 1
EN

Stack Overflow用户

发布于 2013-06-10 20:37:43

@dader --我将以dader的例子为基础。

  1. 使用HTML5 FileSystem API --但是,您可以在javascript对象/数组/字符串中对内存中的一些行进行批处理,而不是每一行都写入文件(比值多),只有在达到某个阈值时才能将其写入文件。这样,您就可以在本地文件中附加进程执行(使暂停/重新启动/停止等更容易)。
  2. 值得注意的是,下面是一个示例,说明如何生成对话框以请求所需的数据量(听起来很大)。在铬中测试: navigator.persistentStorage.queryUsageAndQuota(函数(使用,配额){ var availableSpace =配额-availableSpace;var requestingQuota = args.size + usage;if (availableSpace >= args.size) { window.requestFileSystem(PERSISTENT,availableSpace,persistentStorageGranted,persistentStorageDenied);}args.size{ navigator.persistentStorage.requestQuota( requestingQuota,function ( grantedQuota ) { window.requestFileSystem(PERSISTENT,grantedQuota- usage,persistentStorageGranted,window.requestFileSystem );} },en19#;},en19#;
  3. 完成之后,您可以使用Javascript打开一个新窗口,其中包含您保存的blob对象的url,您可以通过: fileEntry.toURL()检索该窗口
  4. 或者-当它完成运行时,您只需在html链接中显示该URL,然后他们可以右键单击它,并按他们想要的方式保存链接。

但是,这是一种新的、很酷的东西,您完全可以在浏览器中完成,而不需要以任何方式涉及服务器。附带注意,由Javascript进程生成的200-300 of的数据听起来绝对巨大.这将是一个关心您是否要存储“正确”的数据.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16522936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档