HOME>WEBプログラム覚書>[PHP]MySQLを利用した画像の保存と出力
[PHP]MySQLを利用した画像の保存と出力
PHPで画像を取得してMySQLに保存、そしてMySQLからデータを取得して表示させる方法を そろそろ書かないとまずい気がしたので書いておきます。 画像をデータベースに保存するのには、とても重要な意味があります。
その前に、まずは仕組みから。
仕組み
特に難しいことはないのですが、意外と知らない人も多いのではないでしょうか? 僕もPHPやる前は知りませんでしたw
上図が画像ファイルにアクセスして表示されるまでの簡単な流れです。 まぁこの流れ自体は別にどうでもよくて、今回もっとも重要になるのがレスポンスヘッダのcontent-typeです。 content-typeに絡むWEBサーバとブラウザの役割は、
WEBサーバ
拡張子に応じて適切なcontent-typeをheaderに含めてレスポンスする。
ブラウザ
レスポンスに含まれるcontent-typeに応じたレンダリングを行う。
になります。つまり、
ブラウザにとっては「.jpgだから画像なのではなく、Content-typeがimage/jpegだから画像」なのです。 逆に言うと「Content-typeがimage/jpegなら.phpでも.htmlでもブラウザは画像として処理する」のです。
同じファイルをContent-typeを変えて表示した場合のサンプル
Content-type: image/jpeg
PHP
- <?php
- $img = file_get_contents('./img.jpg');
- header('Content-type: image/jpeg');
- echo $img;
- ?>
Content-type: text/html
PHP
- <?php
- $img = file_get_contents('./img.jpg');
- header('Content-type: text/html');
- echo $img;
- ?>
画像の種類に応じたcontent-typeをレスポンスしてあげればよいということです。 あとはブラウザががんばって処理してくれます。
また通常はWEBサーバ(apacheなど)が、拡張子に応じて適切なContent-typeを返してくれるので content-typeについてあれこれ考える必要はありません。
じゃあなぜこんなことを説明してるのか?
データベースに保存した様々な種類の画像(jpg、gif、pngなど)を扱う場合など 一つのファイルで様々な種類の役割ができると、とても便利です。
クライアント(htmlのimgなど)は、どのkeyを指定したらどんな画像が出てくるのかさえわかっていればよく 画像の拡張子を気にしなくて済むからです。
ですがその場合、WEBサーバは適切なContent-typeを出力できないので、 自分で指定してあげる必要があるのです。上記のことがわかってないと 「画像が表示されない!」「文字化け?」というように悩むことになるので予め説明しました。
MySQLデータベースの作成
適当にテーブルを作成。