"data:" URL 方案的值是否有大小限制?我对流行的Web浏览器中的限制感兴趣。换句话说,在<img src="data:image/jpg;base64,base64_encoded_data" />
或background-image: url(data:image/jpg;base64,base64_encoded_data)
中,data:image/jpg;base64,base64_encoded_data
可以有多长?
total_physical_memory / 5
(source)。我刚刚进行了简要检查,嵌入了八个不同尺寸的Jpeg图像,大小从3,844到2,233,076字节不等。
在我的Windows 7(64位)系统上,以下所有浏览器都正确显示了每个图像:
来自http://www.ietf.org/rfc/rfc2397.txt:
"data:" URL 方案仅适用于短值。请注意,某些使用URL的应用程序可能会施加长度限制;例如,在HTML中嵌入在
<A>
锚中的URL具有由HTML的SGML声明确定的长度限制[RFC1866]。LITLEN(1024)限制了单个属性值文字中可以出现的字符数,ATTSPLEN(2100)限制了在标记中出现的所有属性值规范的所有长度的总和,TAGLEN(2100)限制了标记的整体长度。
据我所知,Safari对数据URI有128K的限制:
http://blog.clawpaws.net/post/2007/07/16/Storing-iPhone-apps-locally-with-data-URLs#c1989348
而Chrome的限制是2M:
2017的答案是:使用函数dataURLtoBlob将数据转换为blob。
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 URL
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>')
2017年,Chrome/Firefox可处理大文件。
window.open(temp_url, '_blank');
看起来不需要使用 iframe 等。需要注意的一点是,Chrome 不允许在 blob URL 上执行“文件 > 另存为”操作。 - JoelcharCodeAt
无法正确转换所有字符,我建议使用 new TextEncoder('utf-8').encode
。我在我的帖子中给出了一个例子。 - select提醒:我能够通过JavaScript ajax调用以data url的形式在Firefox 3.5中加载一个130K的图像。但是,在IE 8中,该图像被截断了,而在FF中则完整显示。
看起来在Firefox 3.6中限制是600KB。
我尝试了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);
}