ショップや病院など、タウン情報やグルメ情報などの紹介サイトには写真が使われることが多いです。
写真の画像はフォームからアップロードしてファイルとして保管することが多いですが、データベースでバイナリを管理することもできます。
データベース管理のメリットとデメリット
利点としては、複数の Web サーバ(クラスタ環境)でも、各サーバに画像を配備しなくてもいいなどファイル管理の手間が省けます。
デメリットとしては、画像の取得にデータベースアクセスが必要になることと、容量の問題も出てくるでしょう。
NFS やメモリ上での共有など方法はいろいろありますが、こちらもネットワークのトラフィックなどの問題もあります。
BLOB型で管理する
今回は、初めてデータベース(MySQL)の BLOB 型を利用してみたのでまとめてみました。
まずはファイルアップロード部分です。今回は GD ライブラリや ImageMagic を利用して画像のサイズも動的に変更していますが、その部分は省きます。
1 2 3 4 5 6 7 | // URLやファイルパス $uploadfile = /var/www/hogehoge.jpg; // 画像データを文字列として取得 $image = file_get_contents($uploadfile); // $imageの中身を BLOB 型のカラムに入れる |
次に画像取得スクリプトです。
html 上から画像のみを取得するスクリプトを実行します。
1 2 3 4 5 6 7 8 9 10 11 | [html] <img src="/image.php?id=hogehoge" alt="hogehoge" /> [image.php] // データ取得 $sql = "SELECT * FROM hogehoge WHERE image = ? "; $data = [SQLの実行結果]; header("Content-Type: image/jpeg"); print $data["image_binary"]; exit(); |
データベース接続が気になる場合は、最初のデータ取得時に、ローカルにファイルでキャッシュしておくと速度的にもリソース的にもいいかもしれません。