LoginSignup
30
30

More than 3 years have passed since last update.

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

Last updated at Posted at 2016-11-14

概要

PHPを用いMySQLへ画像保存し今度はそのMySQLに保存された画像データを表示する際に
google_chrome.png
とか
firefox.png
とか
Edge.png
とかで画像表示ができなくなってしまいました。
これを解決するためのポイントを備忘録としてメモしておきます。

実施環境

PHP/5.2.4
DB/MySQL

事前準備

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

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

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

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

解決策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
こちらを大変参考にさせていただきました。ありがとうございました。:thinking:

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

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

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

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

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

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

解決策1~3をして[img_display.php]を更新しても何故か反応しない場合があります。
その時は、
google_chrome.png
を右クリック→新しいタブで画像を開く→更新(F5)
を押してください。
これでなんとか読み込むことができました。

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

まとめ

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

30
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
30