PHPで別の位置にある画像を読み込んで表示する方法

プログラミング
2019年07月04日 10:00

概要

通常Webで画像を表示する場合、imgのsrc属性に画像が置いてあるURLを指定するというのが一般的だと思います。
しかし、画像を置いてあるURLを指定するというのは、画像を表示するためにはそのURLにアクセスできるということを表しています。

そこで、PHPを使って画像のURLを指定しない方法で画像を表示する方法を紹介します。

環境

  • PHP 7.3

どのようにするのか

imgタグのsrc属性には、画像の場所を表すURLを指定する方法もありますが、画像のデータをBase64という方式にエンコードしたものを指定する方法もあります。

つまり、PHPを使って画像をBase64という方式にエンコードし、それをimgタグのsrc属性に設定すれば良いというわけです。

やってみよう

PHPでBASE64でエンコードするのは関数が用意されているため簡単です。
また、エンコードする画像ファイルを取得するのを関数が用意されているので簡単にできます。

$file = file_get_contents(IMAGE_DIR);
$encoded_file = base64_encode($file);

画像ファイルの取得はfile_get_contents関数を使うことでできます。引数にはファイルのパスを指定します。
画像ファイルのエンコードはbase64_encode関数を使うことでできます。引数にはエンコードしたいファイルを指定します。

次にようにしてエンコードしたデータをimgタグに指定します。

<!-- png画像の場合 -->
<img src="data:image/png;base64,<?php echo $encoded_file ?>">
<!-- jpg画像の場合 -->
<img src="data:image/jpg;base64,<?php echo $encoded_file ?>">
<!-- gif画像の場合 -->
<img src="data:image/gif;base64,<?php echo $encoded_file ?>">
<!-- svg画像の場合 -->
<img src="data:image/svg+xml;base64,<?php echo $encoded_file ?>">

画像の種類ごとに微妙に内容が変わるため、気をつける必要があります。

さいごに

結構簡単にできたように感じます。

これで誰からもWebサーバを介してファイルにアクセスできないようにしておいて、ファイルの表示はプログラムを使ってアクセス制御をしながら表示するということができるようになります。