資料 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 編碼。
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$ 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 資源。
lots of text…
<p><a name="bottom">bottom</a>?arg=val</p>
- 語法
-
dataURL 的格式非常簡單,但很容易忘記在“資料”段之前放置逗號,或錯誤地將資料編碼為 base64 格式。 - 在 HTML 中格式化
-
dataURL 在檔案中提供了一個檔案,相對於封閉文件的寬度而言,它可能非常寬。作為 URL,data應該可以使用空格(換行符、製表符或空格)進行格式化,但 使用 base64 編碼時 會出現實際問題。 - 長度限制
-
瀏覽器不需要支援任何特定的最大資料長度。例如,Opera 11 瀏覽器將 URL 的長度限制為 65535 個字元,這將
dataURL 的長度限制為 65529 個字元(如果您使用純data:,不指定 MIME 型別,則 65529 個字元是編碼資料的長度,而不是源資料的長度)。Firefox 97 及更高版本支援長達 32MB 的dataURL(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 的瀏覽器中載入。