数据协议URL大小限制


78

“数据:” URL方案值是否有大小限制?我对流行的Web浏览器中的限制感兴趣。换句话说,多久可以data:image/jpg;base64,base64_encoded_data成为<img src="data:image/jpg;base64,base64_encoded_data" />background-image: url(data:image/jpg;base64,base64_encoded_data)

Answers:


4

关于Web浏览器中的限制,MSIE 6/7不支持数据URL方案...有关Wikipedia的更多信息

每个浏览器的长度限制是不同的-我相信IE8最多允许32KB,Opera是4KB,但无法真正说明其他浏览器...


97

简短答案:数据URI限制有所不同。

有很多答案。就像5年前问这个问题一样,大多数问题由于过时而现在不正确,但是这个问题排在Google结果“数据URI限制”的顶部。数据URI现在得到广泛支持,并且IE 7/8不再是相关的浏览器。下面有许多参考资料,因为今天的答案是微妙的。

数据URI限制

数据URI规范未定义大小限制,但表示应用程序可以强加自己的大小。

  • Chrome- 2MB用于当前文档。否则,该限制是任意Blob的内存中存储限制:如果是x64而不是ChromeOS或Android,则为2GB;否则为2GB。否则,total_physical_memory / 5来源)。
  • Firefox-无限制
  • IE≥9&Edge- 4GB
  • Safari和移动Safari-吗?

备择方案

具有较高限制的一项技术(Chrome中为500MiB)可以替代您的用例,其中一种技巧是使用URL API通过URL.createObjectURL()来使用Blob URL,以及通过File API来使用Blob 。使用URL.createObjectURL()中提供了一个示例。

如何编写文件/将文件提供给用户中所述,还有一些其他选择:FileSaver.jsStreamSaver.jsJSZip

您可以使用Modernizr来检测对超过32kb的数据URI的支持。

相关问题

这些答案与这个问题几乎相同,但是我提到它们是为了节省您阅读每个问题的时间。


Chrome的限制超过2MB,尽管我不清楚确切的限制是什么。对于HTML文档中的嵌入式图像来说,它似乎比在地址栏中输入数据URI更好,后者使Chrome几乎停止了3MB的传输,但两者都起作用。
乔治·希里亚尔

1
@GeorgeHelyar感谢您添加此内容。您是否有机会为嵌入式案例提供更大的参考?
泰勒·埃德米斯顿

我没有参考,只有经验证据。我将3mb图片转换为数据URI,并将其用作html中的img src。
乔治·希里亚尔

1
@GeorgeHelyar我很高兴添加经验证据,如果您可以将其放入js小提琴等中
泰勒·埃德米斯顿,2017年

1
Chrome浏览器的限制仅适用于您所在文档的URL。如果设备有足够的内存,则可以很好地将视频的Gigs加载为dataURI。在2017年将createObjectURL称为“实验技术”是……
Kaiido

44

我只是做了一个快速检查,即嵌入了8个不同的Jpeg图像,大小从38442233076076字节不等。

以下所有浏览器均在Windows 7(64位)系统上正确显示每个图像:

  • 铬14.0.816.0
  • Firefox 11.0
  • 谷歌浏览器18.0.1025.142
  • Internet Explorer 9.0.5(64位)
  • 歌剧11.62
  • Safari 5.1.5

3
我的IE9已同时成为IE10,因此只能向您保证它可以在IE9中使用。它仍然可以在IE10中使用。这是一张约244KBytes的测试图像(请参阅源代码)butterweck.de/test/dataimgtest.html
miasbeck 2013年

10
@miasbeck,为什么停在2 MB?
Pacerier 2015年

@Pacerier没有具体原因。这只是我认为图像可能具有的最大尺寸。
miasbeck 2015年

确实,我的IE(11. *)也抛出了图像。
亚历克西斯·帕克斯

还有一个有点深奥的数据点。如果您碰巧使用数据URI将图像数据传递到Chromecast(例如,相册),则支持的最大长度为64,000字节(而不是64KB)。
aroth

18

http://www.ietf.org/rfc/rfc2397.txt

“ data:” URL方案仅对短值有用。请注意,某些使用URL的应用程序可能会施加长度限制。例如,嵌入<A>在HTML中的锚点中的URL的长度限制由HTML的SGML声明确定[RFC1866]。LITLEN(1024)限制可以在单个属性值文字中出现的字符数,ATTSPLEN(2100)限制出现在标签中的所有属性值规范的所有长度的总和,而TAGLEN(2100)限制标签的总长度。


1
看起来像“数据”在经典HTML中毫无用处。然而,XHTML和CSS可以有不同的限制
LicenseQ

您可能想要找到XHTML的模式和CSS的规范并找出答案。
约翰·桑德斯

2
虽然阅读该规范很有趣,但试图留在其中是不明智的。从本质上来说,我们是Web开发人员,始终处在技术的最前沿。如果您不超出规格范围,则不必要地束缚自己。LicenseQ完全正确,数据URL在这些限制下将完全无用。但是它们并不是没有用,而且限制并不是真正的限制(所有浏览器供应商都忽略了它们来证明)。因此,让自己自由!使用来自miasbeck的信息来发挥自己的优势。它从实际的现实是,我们的节目居住。
斯泰恩德威特

@StijndeWitt,是的。一个不问任何浏览器行为的网络问题“答案”根本不是答案。
Pacerier '17


6

2017年的答案是:将数据转换为具有功能的data Blob:dataURLtoBlob

function dataURLtoBlob(dataurl) {
    var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
    while(n--){
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], {type:mime});
}

然后创建Blob网址

var temp_url = window.URL.createObjectURL(blob);

然后根据需要在新窗口中使用它。

var redirectWindow = window.open('');
redirectWindow.document.write('<iframe src="' + temp_url + '" frameborder="0" style="border:0; top:0px; left:0px; bottom:0px; right:0px; width:100%; height:100%;" allowfullscreen></iframe>')      

在chrome / firefox 2017中处理大文件


1
window.open(temp_url, '_blank');似乎也可以使用,而不需要iframe等。需要注意的一件事是,Chrome不允许在blob URL上执行“文件”>“另存为”。
乔尔(Joel)

由于charCodeAt无法正确转换所有字符,因此建议使用new TextEncoder('utf-8').encode。我在帖子中举一个例子。
选择

使用charCodeAt我没有遇到任何问题。我使用了waza123的解决方案,效果很好。
ashilon



1

似乎Firefox 3.6中的限制为600KB。


1
有任何链接可以备份吗?
xdhmoore 2014年

以下是显示Firefox限制的链接:developer.mozilla.org/zh-CN/docs/Web/HTTP/data_URIs(查找限制)
Carlitos Way 2015年

@CarlitosWay在此处找不到它。
FluorescentGreen17年

@ FluorescentGreen5那是两年前的,我相信Firefox的规格已经改变了……
Carlitos Way

1
@CarlitosWay啊,我刚刚检查了规格,并说它现在是无限的。
FluorescentGreen

1

我尝试了waza123中的代码,但该charCodeAt方法未正确转换所有字符。这是我在浏览器中创建大量下载的解决方案。(我将其用于JSON数据)

function exportToFile(jsonData, fileName) {
    const u8arr = new TextEncoder('utf-8').encode(JSON.stringify(jsonData, null, 2));
    const url = window.URL.createObjectURL(new Blob([u8arr], { type: 'application/json' }));
    const element = document.createElement('a');
    element.setAttribute('href', url);
    element.setAttribute('download', fileName);
    element.style.display = 'none';
    document.body.appendChild(element);
    element.click();
    document.body.removeChild(element);
}

1
这对我有用。我只需要为我的角度应用程序安装TextEncoder类型:npm install --save @ types / text-encoding
jokab

0

注意:IE中还有一些其他限制。对于iframe,上限为4 kb。

在IE9中,删除了DataURI的32kb限制,尽管出于安全原因,它们的使用仍然限于某些上下文(特别是,禁止创建诸如IFRAMES之类的安全上下文的场景)

MSDN

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.