我正在从事一个项目,该项目需要下载存储在多台服务器上的文件。
要求:
- 解决方案必须在客户端使用 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);
...对我来说似乎成功了,不能保证浏览器将始终允许请求如此大量的存储空间。
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/