データベースに画像を保存する際に、BLOB形式で保存されることがあります。
BLOB形式とは、データベースなどでバイナリデータを格納する際のデータ型のことを言います。
なのでBLOB画像というと、テキストデータ以外の「0」と「1」の組み合わせ(「on」と「off」の組み合わせ)で表現される画像データということになります。
このあたりは難しくてイマイチ分からない部分もありますが、とにかくDBへの画像保存の方法のひとつと捉えております(笑)
難しい話はさておき、今回は「BLOB画像をPHPで出力するコード」を記録しておこうと思います。
BLOB形式の画像があるデータベースのイメージ
データベースから取り出したBLOB形式の画像を表示する
#データベース接続プログラム
$dsn = 'mysql:dbname=test;host=localhost;charset=utf8';
$user = 'root';
$password = '';
$dbh = new PDO($dsn,$user,$password);
$dbh->query('SET NAMES utf8');
#sql文(inにてtest_idが1,2,3のいずれか一致するphotoを抽出します)
$sql ="SELECT photo FROM `test_info` WHERE test_id in(1,2,3) ";
$stmt = $dbh -> prepare($sql);
$stmt->execute();
while(1){
$rec = $stmt->fetch(PDO::FETCH_ASSOC);
if($rec==false)
{
print('ありません');
break;
}
$img_src = "data:image/jpeg;base64," . $rec['photo'];
print' <img src="'. $img_src . '" class="topimage" alt="top"/>';
}
$dbh = null;
sql文でデータベース内の「photo」を抽出します。
「photo」には最初に画像で示したようなBLOB形式で画像が格納されています。
そのため、そのままでは表示されません。
imgタグにて表示する前に、
取り出したBLOB→base64にエンコード というステップが必要になります。
簡単!下記が該当の行です。
$img_src = "data:image/jpeg;base64," . $rec['photo'];
print' <img src="'. $img_src . '" class="topimage" alt="top"/>'
今回は、jpeg画像として出力したいので、jpegを指定しています。
(もちろんpngなどの指定も可能です)
BLOB画像が表示されないとき
ブラウザの検証画面で該当のimgタグを確認してみます。
<img src="aaaBBCCC123…">
というような英数字がたくさん並んでいれば、おそらく出力に成功しています。
この場合は、
widthとheightを指定すると表示されることがあります。
(私はこれに数時間悩みましたww)
print' <img src="'. $img_src . '" width="100vw" heigth="auto" class="topimage" alt="top"/>'