PHP で画像を読み込んで、ブラウザに表示させる

PHP でサーバー内の画像を読み込んで、画像データをブラウザに出力して画像を表示させる。

サーバー内に保存された画像データをファイルから読み込む場合

<?php
$image_path = 'images/sample.jpg';

if (file_exists($image_path)) {
    header('Content-Type: image/jpeg');
    // fileread から readfile に訂正
    readfile($image_path);
}
?>

上記のファイルが、URL で http://localhost/image.php にあるとした場合、PHP ファイルにアクセスをすることで、http://localhost/images/sample.jpg の画像を表示させることができる。

メモリ上に展開された画像データ (ストリームやバイナリデータ) を表示させたい場合

<?php
$image_path = 'images/sample.jpg';

if (file_exists($image_path)) {
    $fp   = fopen($image_path,'rb');
    $size = filesize($image_path);
    $img  = fread($fp, $size);
    fclose($fp);

    header('Content-Type: image/jpeg');
    echo $img;
}
?>

とすることで、http://localhost/image.php にアクセスすると、http://localhost/images/sample.jpg を表示させることができる。

注意

画像データはバイナリーデータのため、header 関数出力以前に何かしらのデータが(echo 関数や print 関数等で)出力され (ブラウザに送られ) たり、画像データを出力した後に、何かしらのデータが出力されると正常に画像が表示されない(たいていは PHP ファイルの URL がブラウザに表示される)。
例えば、

  • 実行パスが記述されている場合
#!/usr/bin/env php <- この実行パスがブラウザに送られてしまう
<?php
(後略)
  • UTF-8文字コードでファイルを保存した際に、BOM 付きでファイルを保存している場合
    ファイルを BOM なしで保存すると解決できる
  • ファイルの末尾に改行コードが含まれている場合
(前略)
?>
<- この改行された部分がブラウザに送られてしまう

正しくはファイルの末尾に改行コードを含ませないで保存する。

(前略)
?> <- ファイルの末尾を php のタグで終了させる