如何从多个服务器下载多部分文件

时间:2013-01-25 16:37:37

标签: javascript large-files fileapi

我正在开发一个项目,该项目需要下载存储在多个服务器中的文件。

要求:

  • 解决方案必须是客户端的java脚本。
  • 它应该支持使用大型文件~50G以上。
  • 它应该很快并且不会使浏览器从内存中崩溃 过载。

在发明我自己的“自行车”之前,我只想检查是否有现成的解决方案。我在google和github搜索中找不到一个好的。

如果没有这样的解决方案,可能会对新文件API的限制提出一些建议。它甚至能够处理那么大的文件吗?

1 个答案:

答案 0 :(得分:3)

坦率地说,我非常怀疑你能不能解决这个问题。

对于您正在使用的文件大小,只要让最终用户安装BitTorrent客户端并以这种方式分发您的下载,您就会好得多。

那就是说,需要考虑的几个障碍:

  • 有两个与文件相关的API。 File对象,但仅用于通过拖放操作读取<input type="file">dropped选择的文件。

    您想要的是FileSystem API,但有一个非常重要的警告:此API为您提供了一个虚拟文件系统,其内容被用户隐藏。实际上,这意味着您写入磁盘的文件将存储在用户未知的模糊位置(类似\Users\Me\AppData\Local\Chrome\User Data\Default\File System\000\),用户必须单击特殊构造的链接以启动浏览器的普通文件下载机制(在这种情况下,意味着将文件从“虚拟”文件系统复制到用户的下载文件夹。

  • 由于要将沙箱映射到虚拟文件系统并且必须将文件复制到其目标,因此用户必须具有2 * n 字节空闲。所以我需要100 GB来下载你的50 GB文件。

  • 您的虚拟文件系统必须request quota,并且用户必须先批准该请求才能开始编写。虽然好消息是......

    webkitStorageInfo.requestQuota(webkitStorageInfo.PERSISTENT, 53687091200);
    

    ...似乎对我来说是成功的,并不能保证浏览器总是允许请求这么大的存储空间。

  • 您可以使用Blob对象将FileEntry写入虚拟文件系统。文档不完整,但我希望您可以写入文件中的任意位置。

  • XHR does not apparently allow you to stream response data.当您请求XHR以Blob(新功能)作为响应时,它必须将整个响应缓冲在内存中。

    有些黑客允许您在响应数据进入时轮询XHR对象,但浏览器必然会缓冲整个响应,即使您已经读过以前的字节。

    这意味着您的个人文件部分不能超过几兆字节。平均HTTP请求/响应头开销为800字节 - 1 kB,您只需在50 GB的线路上的HTTP标头中查看额外的50 MB。 (我知道.1%是一个很小的开销,这只是需要考虑的事情。)

再次,不要这样做。使用正确的工具,在这种情况下是BitTorrent。我想在某个地方有一个独立的BT客户端,您可以配置为自动开始下载预配置的torrent。因此,用户只需单击下载链接,启动EXE即可继续使用。