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

Posted

技术标签:

【中文标题】JavaScript Max Blob 大小是不是有任何限制【英文标题】:Is there any limitation on JavaScript Max Blob sizeJavaScript Max Blob 大小是否有任何限制 【发布时间】:2015-04-03 04:08:52 【问题描述】:

我正在尝试使用 AJAX 调用下载文件。我需要使用 AJAX 调用,因为我必须发出一个发布请求以及我需要从客户端发送一些标头。由于服务器 API 不受我们控制,我们除了使用 AJAX 之外别无选择。为了显示文件保存对话框,我将字节数组转换为 blob 到 Object 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 的文件。

【问题讨论】:

【参考方案1】:

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


Chrome (57+ it appears):

根据Chrome's Blob Storage System Design:

Blob 存储限制

我们计算存储限制here。

内存存储限制

如果架构是 x64 而不是 ChromeOS 或 android2GB 否则: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 使用 Chrome 配置文件目录中名为 blob_storage 的目录将 blob 部分存储到磁盘。

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


Opera(44 岁以上或更早):

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


Firefox(53+ 或更早):

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


Safari(10.1+ 或更早版本):

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


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

【讨论】:

你好,请问有没有办法从JS动态查询这样的限制,类似于FileSystem API的queryUsageAndQuota()? @diegocr 我希望,但我认为没有。 不知道有没有人知道IE的文档?从实验上看,似乎 200MB 可能是极限。【参考方案2】:

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

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

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

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

【讨论】:

感谢克劳斯的链接。它非常有帮助。我无法投票赞成您的答案,因为我没有足够的声誉,因为我是新来的。我将创建一些测试用例以跨其他浏览器进行测试。 这个答案已经过时了,参考@Alexander O'Mara的答案

以上是关于JavaScript Max Blob 大小是不是有任何限制的主要内容,如果未能解决你的问题,请参考以下文章

Firebird 的 blob 大小是不是只有 32kb?

如何在 JavaScript 中检查变量是不是为 blob

如何比较 JavaScript 中的两个 blob?

sp_spaceused 如何计算具有 BLOB/溢出/行外类型的表的大小?

如何更改 max_allowed_pa​​cket 大小

二进制 Blob 被截断为 8000 字节 - SQL Server 2008 / varbinary(max)