【PHP】file_get_contentsで取得した画像ファイルを出力すると文字列データとなる

   

先ほど、file_get_contentsで取得した画像ファイルを出力したところ、画像ではなく画像のデータ(文字化けをともなった文字列)が画面いっぱいに表示されました。
1
2
3
4
<?php
$img = file_get_contents("ここに画像のパスやURL");
echo $img;
?>

あれ?おかしいな・・・と思ったんですが、あれこれ考えていたら原因が分かりました。

file_get_contentsで取得したのはデータ

file_get_contentsで取得したのは画像データですが、所詮データなので、これをそのまま出力したらブラウザ上ではデータ(文字列)として扱われます。

そのためブラウザに「このデータは画像データですよ!」と教えてあげなくてはなりません。

つまり、レスポンスヘッダの「content-type」で「jpeg」「png」「gif」・・・などのMINEタイプを指定する必要があります。

ブラウザはcontent-typeを元にファイルを処理する

通常、サーバーは出力するファイルの拡張子に応じてcontent-typeをヘッダーに含めてブラウザからの要求に応えます。そしてブラウザはそのcontent-typeに応じて画面の出力を工夫します。

しかし環境によっては、サーバーがcontent-typeをレスポンスできない時があります。この場合、当然ブラウザはそのファイルをどのように処理すればよいのかわかりません。

このような時に、画像ファイルにも関わらず、画像として表示されるのではなくデータそのものが表示されてしまいます。

content-typeを指定すればよい

ということで、タイトルのような現象になった場合、content-typeを指定してあげれば解決です。

つまり、このようにします(画像ファイルが「jpeg」の場合)。

1
2
3
4
5
<?php
$img = file_get_contents("ここに画像のパスやURL");
header('Content-type: image/jpeg');
echo $img;
?>

なお、画像ファイルのMIMEタイプが「png」「gif」「bmp」ならば次のようにします。

header(‘Content-type: image/png’);
header(‘Content-type: image/gif’);
header(‘Content-type: image/bmp’);

これでブラウザにしっかりと画像ファイルとして処理させることができます。

蛇足

ブラウザは、拡張子が「.jpg」だから「jpgファイルだ」と決めているわけではありません。content-typeで決めています。

逆を突くと、content-typeを「image/gif」とすると、gifファイルではないものをgifファイルとして処理させることができます。

 - PHP, webサイト運営