はじめに
data:// ストリームは、RFC2397で定義された「データをURL内に直接埋め込む」仕組みです。
PHPでは file_get_contents() などのファイル関数でこのスキームを扱うことができ、Base64でエンコードされたデータを自動的にデコードして取得することが可能です。
目次
data:// ストリームラッパーとは
data:// ストリームラッパーは「URLにデータを直接埋め込む」ための仕組みで、PHP 5.2.0 以降で利用できます。
フォーマットは以下の通りです:
data:[<mediatype>][;base64],<data><mediatype>: MIMEタイプ(省略可能、デフォルトはtext/plain);base64: Base64エンコードされたデータが続く場合に指定<data>: 実際のデータ(Base64またはURLエンコード)
PHPでの使用例:
<?php
declare(strict_types=1);
error_reporting(-1);
$s = 'exam test string';
$p = 'data://text/plain;base64,' . base64_encode($s);
var_dump($p); // Data URL文字列を確認
echo file_get_contents($p); // ストリームから中身を取得実行結果:
string(49) "data://text/plain;base64,ZXhhbSB0ZXN0IHN0cmluZw=="
exam test stringここでポイントは、file_get_contents($p) が Base64を自動的にデコードして文字列を返す 点です。
図解:data:// の構造
┌─────────────┬────────────┬──────────────────────────────────┐
│ data: │ text/plain │ base64,ZXhhbSB0ZXN0IHN0cmluZw== │
│ (スキーム) │ (MIME型) │ (エンコード+データ) │
└─────────────┴────────────┴──────────────────────────────────┘var_dump($p)→ URL文字列がそのまま確認できるfile_get_contents($p)→ Base64をデコードした中身を取得
まとめ
data://は RFC2397 に準拠したストリームラッパー- URLに直接データを埋め込める
file_get_contents()で Base64データをデコードして取得可能- MIMEタイプは省略可能、指定することで扱いやすくなる
