PHP 5.5.16 is released

data://

data://データ (RFC 2397)

説明

data: (» RFC 2397) ストリームラッパーは、 PHP 5.2.0 以降で使用可能です。

利用法

  • data://text/plain;base64,

オプション

ラッパーの概要
属性 サポートの有無
allow_url_fopen で制約される No
allow_url_include で制約される Yes
読み込み許可 Yes
書き込み許可 No
追加許可 No
同時読み書き許可 No
stat() のサポート No
unlink() のサポート No
rename() のサポート No
mkdir() のサポート No
rmdir() のサポート No

例1 data:// の内容の表示

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

例2 media type の取得

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

// "text/plain" と表示します
echo $meta['mediatype'];
?>
add a note add a note

User Contributed Notes 3 notes

up
5
admin deskbitz net
4 years ago
If you want to create a gd-image directly out of a sql-database-field you might want to use:

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

this goes also for gif, png, etc using the correct "imagecreatefrom$$$"-function and mime-type.
up
5
sandaimespaceman at gmail dot com
5 years ago
Now PHP supports data: protocol w/out "//" like data:text/plain, not data://text/plain,

I tried it.
up
2
from dot php dot net at brainbox dot cz
3 years ago
When passing plain string without base64 encoding, do not forget to pass the string through URLENCODE(), because PHP automatically urldecodes all entities inside passed string (and therefore all + get lost, all % entities will be converted to the corresponding characters).

In this case, PHP is strictly compilant with the RFC 2397. Section 3 states that passes data should be either in base64 encoding or urlencoded.

VALID USAGE:
<?php
$fp
= fopen('data:text/plain,'.urlencode($data), 'rb'); // urlencoded data
$fp = fopen('data:text/plain;base64,'.base64_encode($data), 'rb'); // base64 encoded data
?>

Demonstration of invalid usage:
<?php
$data
= 'Günther says: 1+1 is 2, 10%40 is 20.';

$fp = fopen('data:text/plain,'.$data, 'rb'); // INVALID, never do this
echo stream_get_contents($fp);
// Günther says: 1 1 is 2, 10@ is 20. // ERROR

$fp = fopen('data:text/plain,'.urlencode($data), 'rb'); // urlencoded data
echo stream_get_contents($fp);
// Günther says: 1+1 is 2, 10%40 is 20. // OK

// Valid option 1: base64 encoded data
$fp = fopen('data:text/plain;base64,'.base64_encode($data), 'rb'); // base64 encoded data
echo stream_get_contents($fp);
// Günther says: 1+1 is 2, 10%40 is 20. // OK
?>
To Top