【问题标题】:Is there any limitation on JavaScript Max Blob sizeJavaScript Max Blob 大小是否有任何限制
【发布时间】:2023-03-07 22:04:01
【问题描述】:

我正在尝试使用 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 的文件。

【问题讨论】:

    标签: javascript ajax download blob


    【解决方案1】:

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


    Chrome (57+ it appears):

    根据Chrome's Blob Storage System Design

    Blob 存储限制

    我们计算存储限制here

    内存存储限制

    • 如果架构是 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 使用 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的答案
    猜你喜欢
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 2023-03-10
    相关资源
    最近更新 更多