PHP Conference Japan 2024

data://

data://資料 (RFC 2397)

說明

data: (» RFC 2397) 資料流包裝器。

用法

  • data://text/plain;base64,

選項

包裝器摘要
屬性 支援
allow_url_fopen 限制
allow_url_include 限制
允許讀取
允許寫入
允許附加
允許同時讀寫
支援 stat()
支援 unlink()
支援 rename()
支援 mkdir()
支援 rmdir()

範例

範例 #1 顯示 data:// 內容

<?php
// 顯示 "I love PHP"
echo file_get_contents('data://text/plain;base64,SSBsb3ZlIFBIUAo=');
?>

範例 #2 取得媒體類型

<?php
$fp
= fopen('data://text/plain;base64,', 'r');
$meta = stream_get_meta_data($fp);

// 顯示 "text/plain"
echo $meta['mediatype'];
?>
新增註解

使用者貢獻的註解 3 則註解

from dot php dot net at brainbox dot cz
14 年前
當傳遞未經 base64 編碼的純文字字串時,別忘了將字串通過 urlencode() 處理,因為 PHP 會自動將傳遞字串中的所有實體進行 URL 解碼(因此所有 + 號會遺失,所有 % 實體會轉換為對應的字元)。

在這種情況下,PHP 嚴格遵守 RFC 2397。第 3 節指出,傳遞的資料應該以 base64 編碼或 URL 編碼。

有效用法
<?php
$fp
= fopen('data:text/plain,'.urlencode($data), 'rb'); // URL 編碼的資料
$fp = fopen('data:text/plain;base64,'.base64_encode($data), 'rb'); // base64 編碼的資料
?>

無效用法的示範
<?php
$data
= 'Günther 說:1+1 等於 2,10%40 等於 20。';

$fp = fopen('data:text/plain,'.$data, 'rb'); // 無效,千萬別這樣做
echo stream_get_contents($fp);
// Günther 說:1 1 等於 2,10@ 等於 20。 // 錯誤

$fp = fopen('data:text/plain,'.urlencode($data), 'rb'); // url 編碼後的資料
echo stream_get_contents($fp);
// Günther 說:1+1 等於 2,10%40 等於 20。 // 正確

// 有效選項 1:base64 編碼後的資料
$fp = fopen('data:text/plain;base64,'.base64_encode($data), 'rb'); // base64 編碼後的資料
echo stream_get_contents($fp);
// Günther 說:1+1 等於 2,10%40 等於 20。 // 正確
?>
admin deskbitz net
14 年前
如果您想直接從 SQL 資料庫欄位建立 gd 圖像,您可能會想使用

<?php
$jpegimage
= imagecreatefromjpeg("data://image/jpeg;base64," . base64_encode($sql_result_array['imagedata']));
?>

這也適用於 gif、png 等,使用正確的 "imagecreatefrom$$$"- 函數和 MIME 類型。
sandaimespaceman at gmail dot com
16 年前
現在 PHP 支援不帶 "//" 的 data: 協定,例如 data:text/plain,而不是 data://text/plain,

我試過了。
To Top