JavaScript Max Blob 大小是否有任何限制

IT技术 javascript ajax download blob
2021-03-12 22:31:12

我正在尝试使用 AJAX 调用下载文件。我需要使用 AJAX 调用,因为我必须发出一个 post 请求,同时我需要从客户端发送一些标头。由于服务器 API 不在我们的控制之下,我们除了使用 AJAX 之外别无选择。为了显示文件保存对话框,我将字节数组转换为 blob 到对象 URL,如下所示

var oReq = new XMLHttpRequest();
oReq.open("POST","api/operations/zip", true);
oReq.responseType = "arraybuffer";
oReq.onload = function(oEvent) { 
   var blob=new Blob([oReq.response], {type: 'application/octet-binary'}); 
   var link=document.createElement('a'); 
   link.href=window.URL.createObjectURL(blob); 
   link.download="myFileName.zip"; link.click();  
}
oReq.send(filePaths);

现在我想知道除了浏览器内存限制之外,我们在 JavaScript 中Blob 大小是否有任何限制如果我有大约 8 GB 的 RAM,是否可以下载 4 GB 的文件。

2个回答

现有的答案似乎已经过时了。


Chrome(出现 57+):

根据Chrome 的 Blob 存储系统设计

Blob 存储限制

我们在这里计算存储限制

内存存储限制

  • 如果架构是 x64 而不是 ChromeOS 或 Android: 2GB
  • 否则: total_physical_memory / 5

磁盘存储限制

  • 如果 Chrome 操作系统: disk_size / 2
  • 如果安卓: disk_size / 20
  • 别的: disk_size / 10

注意:ChromeOS 的磁盘是用户分区的一部分,与系统分区是分开的。

最低磁盘可用性

我们限制我们的磁盘限制以适应最低磁盘可用性。我们使用的等式是:

min_disk_availability = in_memory_limit * 2

示例限制

(所有大小以 GB 为单位)

Device          | Ram | In-Memory Limit | Disk | Disk Limit | Min Disk Availability
----------------+-----+-----------------+------+------------+----------------------
Cast            | 0.5 | 0.1             | 0    | 0          | 0
Android Minimal | 0.5 | 0.1             | 8    | 0.4        | 0.2
Android Fat     | 2   | 0.4             | 32   | 1.5        | 0.8
CrOS            | 2   | 0.4             | 8    | 4          | 0.8
Desktop 32      | 3   | 0.6             | 500  | 50         | 1.2
Desktop 64      | 4   | 2               | 500  | 50         | 4

澄清disk_size一下显然是总磁盘大小,而不是可用磁盘空间(可能是出于隐私原因,但似乎可能会导致问题)。

Chrome 使用blob_storage在 Chrome 配置文件目录中调用的目录将 blob 部分存储到磁盘。

如果可用磁盘空间或可用 RAM 小于软件限制,我不确定是否或如何施加其他一些限制。当我知道更多时,我会更新这个答案。


Opera(44+ 或更早):

与 Chrome 相同,因为它基于 Chromium。


Firefox(53+ 或更早):

没有明显的硬限制。我能够创建比“800 MiB”FileSaver.js 声明大得多的 Blob。它不使用磁盘空间来支持更大的 blob,所以它都在内存中,可能与操作系统将内存分页到磁盘。这意味着比内存大的 blob 是可能的,尽管性能可能很差。


Safari(10.1+ 或更早版本):

没有明显的硬限制。它不使用磁盘空间来支持更大的 blob,所以它都在内存中,可能与操作系统将内存分页到磁盘。这意味着比内存大的 blob 是可能的,尽管性能可能很差。


当我学习它们时,将添加其他浏览器限制。

@diegocr 我希望,但我认为没有。
2021-04-23 22:31:12
嗨,您知道是否有某种方法可以从 JS 动态查询此类限制,类似于 FileSystem API 的 queryUsageAndQuota()?
2021-05-05 22:31:12
我想知道是否有人知道 IE 的文档?实验上似乎 200MB 可能是限制。
2021-05-12 22:31:12

Blob 在 Chrome 中似乎被限制为 500MiB,并且当前存储在内存中,但正在进行重新设计:

https://code.google.com/p/chromium/issues/detail?id=375297

其他浏览器实现的限制略有不同:

https://github.com/eligrey/FileSaver.js/#supported-browsers

此答案已过时,请参阅@Alexander O'Mara 的答案
2021-05-14 22:31:12
感谢克劳斯的链接。它非常有帮助。我不能投票赞成你的答案,因为我没有足够的声誉,因为我是新来的。我将创建一些测试用例来跨其他浏览器进行测试。
2021-05-16 22:31:12