下载大文件

5
我有一份文件,以块列表的形式表示,并且目标是下载所有块,然后将它们合并并保存为一个文件。

要求

  1. 应适用于大文件
  2. 应该是可跨浏览器解决方案

我找到的解决方案...

  1. 使用JS数组
    是的,我们可以在常规Javascript数组中下载和存储所有块。
    • 它是跨浏览器的解决方案
    • 但如果文件大小超过自由内存,则使用RAM,浏览器会崩溃...
  2. FileSaver.js
    • 部分跨浏览器
    • 有限的文件大小
  3. StreamSaver.js
    • 不是跨浏览器
    • 适用于大文件
  4. Filesystem API
    • 这是Chrome沙箱文件系统api
    • 适用于大文件

但是,我仍然无法在满足要求的情况下达成我的目标...
如果有人有最好的解决方案经验,请在这里分享。谢谢。


你必须在JS中下载块吗?如果你从服务器作为下载输出,浏览器将把所有内容收集到一个未处理的文件中。另一种选择是下载块并在浏览器外部本地重新组合它们,也许使用简单的cat或者更高级的多个zip文件在一个归档中。 - dandavis
我需要在浏览器中合并块并保存为文件。 - Rashad Ibrahimov
1个回答

5

很遗憾,目前还没有跨浏览器的选项。

在Chrome中,你可以使用非标准的文件系统API或Blobs(如果Blob很大,Chrome将使用文件系统)

在Firefox中,你可以使用可能使用非标准的IDBMutableFile。但是,它将无法与下载API一起使用,因此您必须使用window.location将浏览器发送到Blob URL,浏览器必须下载该URL(对于所有文件扩展名可能不会发生)。您还可能需要使用IDB持久选项来处理大于约2GB的文件。

在其他浏览器中,Blob是您唯一的选择。好处是,运行浏览器的操作系统可能使用分页,从而使浏览器能够创建大于内存的Blob

一种基于service-worker的选项,例如StreamSaver,也可能有所帮助(或许这可以成为Firefox的下载API替代方案),但是浏览器等待完整响应的时间有限(或者说曾经有限),这意味着你可能需要下载和存储分块以在规定时间内完成响应。

感谢您详细的回答。我认为对于小文件,最佳实践是将块写入数组,从数组创建Blob并保存它,而对于大文件,也许可以使用Filesystem API(如果浏览器是Chrome),否则显示“不支持”... 不确定是否在Firefox中使用IDBMutableFile。 - Rashad Ibrahimov
我尝试创建块的数组,它正好使用了可用内存,然后崩溃了。也许我在Chrome如何使用分页来创建大于内存的Blob方面错过了什么。 - Rashad Ibrahimov
@RashadIbrahimov Chrome应该会自动处理(或者至少应该是这样)。也许每个单独的块太小了,所以Chrome将其保留在内存中?如果使用更大的块,您可能会得到不同的结果。不幸的是,我认为它的工作原理没有任何文档记录。 - Alexander O'Mara
是的,我尝试了1MB大小的块,需要检查更大的大小。谢谢你的帮助。希望有一天我们能有一些标准的方法来处理大文件 :) - Rashad Ibrahimov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接