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

标签 javascript large-files fileapi

我正在从事一个项目,该项目需要下载存储在多台服务器上的文件。

要求:

  • 解决方案必须在客户端使用 java 脚本。
  • 它应该支持处理大文件 ~ 50G 或更多。
  • 它应该很快并且不会让浏览器从内存中崩溃 重载。

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

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

最佳答案

坦率地说,我严重怀疑您能否完成此任务。

对于您正在处理的文件大小,您最好只要求您的最终用户安装 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 的响应时(一项新功能),它必须在内存中缓冲整个响应。

    有些 hack 允许您轮询 XHR 对象以获取传入的响应数据,但浏览器必然会缓冲整个响应,即使您已经读取了之前的字节也是如此。

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

再说一次,不要这样做。使用正确的工具来完成工作,在本例中是 BitTorrent。我想在某个地方有一个独立的 BT 客户端,您可以将其配置为自动开始下载预配置的 torrent。因此,用户只需单击下载链接,启动 EXE,然后就可以开始了。

关于javascript - 如何从多个服务器下载多部分文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14526227/

相关文章:

javascript - 文件的 JavaScript 中的快速低冲突非加密哈希

javascript - 文件写入器 API : use blob to write data

javascript - 在 Angular2 中重置路由更改时的服务变量

javascript - 将 react-datepicker css 加载到 jsx 文件中的问题

javascript - ember 保存调用不会成功 block

c - 只需要写一个大文件就需要 O_LARGEFILE 吗?

javascript - 未处理的拒绝 - Passport 登录应用程序 Node js

regex - 非常大的文件之间的 Grep 模式匹配太慢了

java - 使用 ftp 执行远程 java 程序,远程计算机上的非常大的数据集 - 程序到数据与数据到程序

javascript - 脚本 5007 : Unable to get value of the property '0' : object is null or undefined