PHP+MySQLで画像保存と画像表示(備忘録)


概要

PHPを用いMySQLへ画像保存し今度はそのMySQLに保存された画像データを表示する際に

とか

とか

とかで画像表示ができなくなってしまいました。
これを解決するためのポイントを備忘録としてメモしておきます。

実施環境

PHP/5.2.4
DB/MySQL

事前準備

http://d.hatena.ne.jp/steel-plate/20070910/1201454906
こちらを大変参考にさせていただきました。ありがとうございました。
いい感じに実装させていざ画像出力!!!

..........

解決策1 PHPファイルをUTF-8(BOM無し)で保存する

UTF-8にはBOM有りとBOM無しがあります。
BOM有のままファイルを保存してMySQLのデータベースに画像データのバイナリを保存すると画像の最初3バイトに 画像としてふさわしくない情報が追加されるみたいです。

http://dotnsf.blog.jp/archives/1041643802.html
こちらが大変参考になりました。ありがとうございました。

解決策2 テーブルの型に注意する

BLOB型とTEXT型がぐちゃぐちゃになっていました。

テーブル1

レコード id name data
INTEGER CHAR MEDIUMBLOB

BLOB型はバイナリデータを格納する。
つまり、画像のバイナリデータを直接INSERTすれば良い。

テーブル2

レコード id name data
INTEGER CHAR MEDIUMTEXT

TEXT型は文字列を格納する。
つまり、画像のバイナリデータをbase64encode("画像のバイナリデータ")を用い文字列型に変換しINSERTを行う。
また、画像表示するときはbase64decode("文字列")を用い元の画像のバイナリデータに戻す。

http://www.dbonline.jp/mysql/type/index6.html
こちらを大変参考にさせていただきました。ありがとうございました。

解決策3 文字のエスケープにはquotemeta(文字列)を用いる

addslashes(文字列)は文字列の中の「\」「NULL」「"」「'」の4種類の文字しかエスケープできません。
quotemeta(文字列)は文字列の中の「^」「(」「)」「$」「+」「*」「?」「[」「]」「.」「\」の11種類の文字をエスケープします。

base64encodeした後はエスケープしてください。

なぜかaddslashes(文字列)では出来なかったです。
しかしquotemeta(文字列)では表示できるようになりました。
推測では、前者では4文字しかエスケープ出来ないという事で中途半端にエスケープされていたのかなと考えています。

http://www.php-ref.com/bapi/02_addcslashes.html
こちらを大変参考にさせていただきました。ありがとうございました。

解決策4 解決策1~3を用いた後ブラウザのキャッシュを更新する

解決策1~3をして[img_display.php]を更新しても何故か反応しない場合があります。
その時は、

を右クリック→新しいタブで画像を開く→更新(F5)
を押してください。
これでなんとか読み込むことができました。

推測としては、[img_display.php]は更新されているが、画像として認識されている[get_img.php]は前のキャッシュのままであると考えています。
したがって、[get_img.php]を更新してあげることによって画像を取得することができました。

まとめ

MySQLに画像データを上げる場合に画像データが壊れてしまうという点を解消しました。
貴重な時間を割き、お読み下さいましてありがとうございました。