3

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

要求:

  • 解决方案必须在客户端使用 java-script。
  • 它应该支持处理 50G 以上的大文件。
  • 它应该很快并且不会因内存过载而导致浏览器崩溃。

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

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

4

1 回答 1

3

坦率地说,我严重怀疑你能否成功。

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

也就是说,需要考虑一些障碍:

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

    您想要的是FileSystem API,但有一个非常重要的警告:此 API 为您提供了一个虚拟文件系统,其内容对用户来说是模糊的。实际上,这意味着您写入磁盘的文件将存储在用户不知道的隐蔽位置(\Users\Me\AppData\Local\Chrome\User Data\Default\File System\000\例如这种情况下,意味着将文件从“虚拟”文件系统复制到用户的下载文件夹。

  • 由于被沙盒化到虚拟文件系统并且必须将文件复制到其目的地,用户必须有 2 * n字节可用。所以我需要 100 GB 来下载你的 50 GB 文件。

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

    webkitStorageInfo.requestQuota(webkitStorageInfo.PERSISTENT, 53687091200);
    

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

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

  • XHR 显然不允许您流式传输响应数据。 当您请求 XHR 将响应作为Blob(一项新功能)提供给您时,它必须在内存中缓冲整个响应。

    有一些技巧可以让您在 XHR 对象进入时轮询响应数据,但浏览器必须缓冲整个响应,即使您已经读取了以前的字节。

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

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

于 2013-01-25T18:40:07.953 回答