この記事は 一人PHP総復習 Advent Calendar 2016 21日目の記事です!
PHPで画像出力する方法について!
同じような記事、知見は結構あるんですけど、初心者向けの一連の記事ということで許してね(´・ω・`)
画像を出力ってどういうこと?
<?php
echo 'Hello, world!';
上記のように記述してあるindex.phpを読み込むと、Hello, world!と表示されますよね。
同様に、あるphpファイルを読み込むと画像を出力させます。
それだけのことなんだけど初心者の時なかなか理解できなかった・・。
書き方
ベタのPHPで書く
HTTPヘッダで、「これは画像です」ということを宣言してファイルを読み込みます。
例えばpublic/images/hoge.pngというパスの画像を出力する場合。
<?php
header('Content-Type: image/png');
readfile('public/images/hoge.png');
以上です。簡単ですね!!
content-typeに指定するのはMIMEタイプという画像の種類(ここではimage/png
のこと)で、関数を使って取得することができます。
<?php
$file = 'public/images/hoge.png';
//MIMEタイプの取得
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime_type = $finfo->file($img_file);
header('Content-Type: '.$mime_type);
readfile($file);
ファイルの拡張子は偽装されている場合もあるので、予期せぬエラーを避ける為に拡張子を取得する際もMIME TYPEから判定する場合が多いです。
PHPマニュアル
おまけ: フレームワークを使う
紹介程度に書きます。例えばLaravelの場合。
public function showImage() {
$file = public_path('image/hoge.png');
$mime_type = File::mimeType($file);
$headers = [
'Content-type' => $mime_type
];
response()->file($file, $headers);
}
一見見慣れない関数が多くて「!?」となるかもしれませんが、動的な処理がしやすい&Laravel内部で細々したエラーなどを吸収してくれるところがとっても便利です。
フレームワークを使えば、ルーティング処理をして画像を出力することも簡単にできます。
例えば/image
にアクセスしたら画像を表示するとか。
Route::get('/image', 'SampleController@showImage');
画像にアクセス制限をかけたり条件分岐させたりという時に有用になってきます。
ファイルの処理は予期せぬエラーが多いので、フレームワークを使うのがよいですね!