data: URL

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

Data URLs,以 data: scheme 开头的 URL,允许内容创建者将小型文件内嵌到文档中。它们以前被称为“data URIs”,直到该名称被 WHATWG 弃用。

注意: 现代浏览器将 Data URLs 视为独特的、不透明的源,而不是继承负责导航的设置对象的源。

语法

url
data:[<media-type>][;base64],<data>
data

URL 的 scheme。

<media-type> 可选

指示数据类型的 MIME 类型,例如 JPEG 图像文件的 image/jpeg。如果省略,则默认为 text/plain;charset=US-ASCII。您可以在这里找到 MIME 类型结构的完整解析网络上常见 MIME 类型表

;base64 可选

指示数据应进行 base64 解码;请参阅 将数据编码为 base64 格式

<data>

数据本身。如果数据包含 RFC 3986 中定义的 保留字符,或包含空格、换行符或其他非打印字符,则这些字符必须进行 百分比编码。如果数据是文本,您可以嵌入文本(使用适合包含文档类型的相应实体或转义符)。否则,您可以指定 base64 来嵌入 base64 编码的二进制数据。

一些示例

data:,Hello%2C%20World%21

文本/纯文本数据 Hello, World!。请注意逗号如何被 百分比编码%2C,空格字符被编码为 %20

data:text/plain;base64,SGVsbG8sIFdvcmxkIQ==

上面内容的 base64 编码版本

data:text/html,%3Ch1%3EHello%2C%20World%21%3C%2Fh1%3E

包含 <h1>Hello, World!</h1> 的 HTML 文档

data:text/html,%3Cscript%3Ealert%28%27hi%27%29%3B%3C%2Fscript%3E

包含 <script>alert('hi');</script> 并执行 JavaScript alert 的 HTML 文档。请注意,必须有闭合的 script 标签。

将数据编码为 base64 格式

Base64 是一组二进制到文本的编码方案,它通过将其转换为基数 64 表示形式,以 ASCII 字符串格式表示二进制数据。由于它仅包含 URL 语法允许的字符(“URL 安全”),因此我们可以安全地在 data URL 中编码二进制数据。Base64 使用 +/ 字符,这些字符在 URL 中可能有特殊含义。因为 Data URLs 没有 URL 路径段或查询参数,所以在这种情况下这种编码是安全的。

在 JavaScript 中编码

Web API 具有用于编码或解码 base64 的原生方法:Base64

在 Unix 系统上编码

在 Linux 和 macOS 系统上,可以使用命令行 base64(或者,作为替代,使用带 -m 参数的 uuencode 工具)来完成文件或字符串的 Base64 编码。

bash
echo -n hello|base64
# outputs to console: aGVsbG8=

echo -n hello>a.txt
base64 a.txt
# outputs to console: aGVsbG8=

base64 a.txt>b.txt
# outputs to file b.txt: aGVsbG8=

在 Microsoft Windows 上编码

在 Windows 上,可以使用 PowerShell 中的 Convert.ToBase64String 来执行 Base64 编码。

[convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("hello"))
# outputs to console: aGVsbG8=

或者,GNU/Linux shell(例如 WSL)提供了 base64 工具。

bash
bash$ echo -n hello | base64
# outputs to console: aGVsbG8=

常见问题

本节介绍创建和使用 data URL 时常见的问

data:text/html,lots of text…<p><a name%3D"bottom">bottom</a>?arg=val</p>

这表示一个 HTML 资源,其内容是

html
lots of text…
<p><a name="bottom">bottom</a>?arg=val</p>
语法

data URL 的格式非常简单,但很容易忘记在“data”部分之前添加逗号,或者错误地将数据编码为 base64 格式。

在 HTML 中格式化

data URL 提供了一个文件中的文件,相对于包含文档的宽度,它可能非常宽。作为 URL,data 应该可以使用空格(换行符、制表符或空格)进行格式化,但 在使用 base64 编码时 会出现实际问题。

长度限制

浏览器不要求支持任何特定的最大数据长度。Chromium 和 Firefox 将 data URL 限制为 512MB,Safari (WebKit) 将其限制为 2048MB。请注意,Firefox 97 将限制从 256KB 提高到 32MB,Firefox 136 将其提高到 512MB

缺乏错误处理

媒体中的无效参数,或在指定 'base64' 时出现拼写错误,都会被忽略,但不会提供错误。

不支持查询字符串等

data URL 的数据部分是不透明的,因此尝试将查询字符串(页面特定参数,语法为 <url>?parameter-data)与 data URL 一起使用,只会将查询字符串包含在 URL 所表示的数据中。

安全问题

一些安全问题(例如网络钓鱼)与 data URL 有关,并且在浏览器的顶层导航中出现。为了缓解这些问题,所有现代浏览器都阻止了到 data: URL 的顶层导航。有关更多详细信息,请参阅 Mozilla 安全团队的这篇博文

规范

规范
“data” URL scheme
# 第 2 节

浏览器兼容性

另见