概要
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に画像データを上げる場合に画像データが壊れてしまうという点を解消しました。
貴重な時間を割き、お読み下さいましてありがとうございました。