Data URL
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Data URL 是以 data:
開頭的 URL,允許內容創作者將小型檔案嵌入文件中。以前它們被稱為「data URI」,直到 WHATWG 將這個名稱廢除。
備註:現代瀏覽器將 Data URL 視為唯一的不透明來源,而不是繼承導航設置對象的來源。
語法
Data URL 由四個部分組成:前綴(data:
)、指示數據類型的 MIME 類型、如果非文本則可選的 base64
標記,以及數據本身:
data:[<mediatype>][;base64],<data>
mediatype
是一個 MIME 類型字串,例如 'image/jpeg'
表示 JPEG 圖像文件。如果省略,默認為 text/plain;charset=US-ASCII
。
如果數據包含 RFC 3986 定義的保留字元或包含空格字元、換行字元或其他不可打印字元,這些字元必須 URL 編碼。
如果數據是文本,可以嵌入文本(使用適當的實體或根據包含文件的類型進行轉義)。否則,可以指定 base64
來嵌入 base64 編碼的二進制數據。你可以在這裡和這裡找到有關 MIME 類型的更多訊息。
幾個範例:
data:,Hello%2C%20World%21
-
文本/純文本數據
Hello, World!
。注意逗號被 URL 編碼為%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 警告。注意閉合 script 標籤是必需的。
將數據編碼為 base64 格式
Base64 是一組二進制到文本編碼方案,通過轉換為 radix-64 表示法將二進制數據表示為 ASCII 字串格式。由於僅由 ASCII 字元組成,base64 字串通常是 URL 安全的,因此可以用來在 Data URL 中編碼數據。
在 JavaScript 中編碼
Web API 原生方法提供了編碼或解碼為 base64 的方法:Base64。
在 Unix 系統上編碼
在 Linux 和 macOS 系統上可以使用命令行 base64
來對文件或字串進行 base64 編碼(或者可以使用帶有 -m
參數的 uuencode
工具作為替代)。
echo -n hello|base64
# 輸出到控制台: aGVsbG8=
echo -n hello>a.txt
base64 a.txt
# 輸出到控制台: aGVsbG8=
base64 a.txt>b.txt
# 輸出到文件 b.txt: aGVsbG8=
在 Microsoft Windows 上編碼
在 Windows 上,可以使用 PowerShell 的 Convert.ToBase64String 進行 base64 編碼:
[convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("hello")) # 輸出到控制台: aGVsbG8=
或者,可以使用 GNU/Linux shell(例如 WSL)提供的 base64
工具:
bash$ echo -n hello | base64
# 輸出到控制台: aGVsbG8=
常見問題
此部分描述創建和使用 data
URL 時常見的問題。
data:text/html,lots of text…<p><a name%3D"bottom">bottom</a>?arg=val</p>
這表示一個 HTML 資源,其內容為:
lots of text…
<p><a name="bottom">bottom</a>?arg=val</p>
- 語法
-
data
URL 的格式非常簡單,但很容易忘記在「data」段之前加上逗號,或者錯誤地將數據編碼為 base64 格式。 - HTML 中的格式化
-
一個
data
URL 在文件中提供了一個文件,這可能相對於包含文件的寬度非常寬。作為 URL,data
應該可以用空白(換行、制表符或空格)來格式化,但在使用 base64 編碼時會出現一些實際問題。更多訊息。 - 長度限制
-
瀏覽器不需要支持任何特定的最大數據長度。例如,Opera 11 瀏覽器將 URL 限制為 65535 個字元,這限制了
data
URLs 的最大長度為 65529 個字元(如果使用簡單的data:
,不指定 MIME 類型,65529 個字元是編碼數據的長度,而不是源長度)。Firefox 97 版本及更高版本支持的data
URLs 最多可達 32MB(97 之前的版本限制接近 256MB)。Chromium 對超過 512MB 的 URL 提出異議,Webkit (Safari) 對超過 2048MB 的 URL 提出異議。 - 缺乏錯誤處理
-
媒體中的無效參數或在指定
'base64'
時的錯字會被忽略,但不會提供錯誤。 - 不支持查詢字串等
-
Data URL 的數據部分是不透明的,因此嘗試在 Data URL 中使用查詢字串(頁面特定參數,語法為
<url>?parameter-data
)將只是將查詢字串包含在 URL 表示的數據中。 - 安全問題
-
一些與 Data URL 相關的安全問題(例如釣魚),以及在瀏覽器的頂層導航到 Data URL 的問題。為了減輕這些問題,現代瀏覽器在頂層導航中禁止 Data URL。詳情請參見Mozilla 安全團隊的這篇部落格文章。
規範
Specification |
---|
The "data" URL scheme # section-2 |
瀏覽器相容性
BCD tables only load in the browser