JavaScript的最大Blob大小是否有限制?

33

我正在尝试使用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个回答

48

现有的答案似乎大部分都已经过时了。


Chrome (版本57以上):

根据Chrome Blob存储系统设计

Blob存储限制

我们在此处计算存储限制。

内存中存储限制

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

磁盘存储限制

  • 如果是ChromeOS:disk_size / 2
  • 如果是Android: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 在 Chrome 配置文件目录中使用一个名为 blob_storage 的目录将 Blob 部分存储到磁盘上。

如果可用磁盘空间或可用 RAM 小于软件限制,我不确定是否会强制实施其他限制。当我了解更多信息时,我会更新此答案。


Opera(44+ 或更早版本):

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


Firefox(53+ 或更早版本):

没有明显的硬限制。我能够创建比 FileSaver.js 声称的“800 MiB”大得多的 Blob。它不使用磁盘空间来支持更大的 Blob,所以所有内容都存储在内存中,可能还包括操作系统将内存换出到磁盘。这意味着可能存在比内存更大的 Blob,但可能会降低性能。


Safari(10.1+ 或更早版本):

没有明显的硬限制。它不使用磁盘空间来支持更大的 Blob,所以所有内容都存储在内存中,可能还包括操作系统将内存换出到磁盘。这意味着可能存在比内存更大的 Blob,但可能会降低性能。


其他浏览器限制将在我了解它们时添加。


你好,你知道是否有一种类似于FileSystem API的queryUsageAndQuota()的方法可以动态查询JS中的限制吗? - diegocr
@diegocr 我希望有,但我不认为存在。 - Alexander O'Mara
我想知道有没有人知道IE的文档?实验性地看,似乎200MB可能是极限。 - HaveSpacesuit

24

2
谢谢Klaus提供的链接,非常有帮助。由于我是新来的,声望不够,所以无法给你的答案点赞。我会创建一些测试用例,在其他浏览器上进行测试。 - Vikash
5
这个回答已经过时,请参考 @Alexander O'Mara 的回答。 - NikxDa

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