数据 URL

数据 URL,以 data: 方案为前缀的 URL,允许内容创建者在文档中内联嵌入小型文件。在 WHATWG 弃用该名称之前,它们以前被称为“数据 URI”。

注意:现代浏览器将数据 URL 视为唯一的非透明来源,而不是继承负责导航的设置对象的来源。

语法

数据 URL 由四个部分组成:前缀 (data:)、指示数据类型的 MIME 类型、如果是非文本数据则为可选的 base64 令牌,以及数据本身。

data:[<mediatype>][;base64],<data>

mediatype 是一个 MIME 类型 字符串,例如 JPEG 图像文件的 'image/jpeg'。如果省略,则默认为 text/plain;charset=US-ASCII

如果数据包含 RFC 3986 中定义的保留字符,或包含空格字符、换行符或其他非打印字符,则必须对其进行 百分比编码

如果数据是文本数据,您可以嵌入文本(根据封闭文档的类型使用相应的实体或转义符)。否则,您可以指定 base64 来嵌入 base64 编码的二进制数据。您可以在 此处此处 找到有关 MIME 类型的更多信息。

一些示例

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> 的 HTML 文档,它执行 JavaScript 警报。请注意,需要关闭脚本标签。

将数据编码为 base64 格式

Base64 是一组二进制到文本编码方案,通过将其转换为基数 64 表示法,以 ASCII 字符串格式表示二进制数据。通过仅包含 URL 语法允许的字符(“URL 安全”),我们可以安全地在数据 URL 中编码二进制数据。Base64 使用字符 +/,它们在 URL 中可能具有特殊含义。由于数据 URL 没有 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 时经常出现的问题。

html
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 的格式非常简单,但很容易忘记在“数据”段之前放置逗号,或错误地将数据编码为 base64 格式。

在 HTML 中格式化

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

长度限制

浏览器不需要支持任何特定的最大数据长度。例如,Opera 11 浏览器将 URL 的长度限制为 65535 个字符,这将 data URL 的长度限制为 65529 个字符(如果您使用纯 data:,不指定 MIME 类型,则 65529 个字符是编码数据的长度,而不是源数据的长度)。Firefox 97 及更高版本支持长达 32MB 的 data URL(97 之前,限制接近 256MB)。Chromium 反对超过 512MB 的 URL,Webkit(Safari)反对超过 2048MB 的 URL。

缺少错误处理

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

不支持查询字符串等

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

安全问题

一些安全问题(例如,网络钓鱼)与数据 URL 以及在浏览器顶级导航到它们相关联。为了缓解此类问题,所有现代浏览器都阻止了到 data: URL 的顶级导航。有关更多详细信息,请参阅 Mozilla 安全团队的这篇博文

规范

规范
"data" URL 方案
# 第 2 节

浏览器兼容性

BCD 表仅在启用 JavaScript 的浏览器中加载。

另请参阅