昨日に引き続き(って全然書いてねーか)、肩コリがひどかったから6時に帰社した。バイナリデータをデータベースに出し入れする方法がどうしてもわからず、気になってしかたなかったので、会社を出たらそのまま書泉ブックタワー2FのPC書籍のデータベース棚へ。
しばらく冷やかした後、棚の向かいに不意に目を向けると、前の職場のご意見番であり、先輩であり、バイナリ世界の神であるところのM氏がいました。このヒトはこれからも独自APIを(自分に)実装していくのかしら、とか不謹慎なことを考えてしまいました。もちろん、話しかけませんでしたけど。
_ <バイナリデータ(画像ファイルとか)のMySQLへの格納方法>
さすがに今月はPHPのマンモス赤本・青本の両方を買ってしまったので、他の本は欲しいけど買えないなあーと思いながら探すと…あったよー。:-)
バイナリファイルをアップロードし、$_FILESに格納
↓
アップロードしたデータをfreadで読み込み
↓
base64()でバイナリ→文字列へエンコード
↓
addslashes()で文字をスラッシュでクォート(←こう書くと意味わかんね)
↓
SQL発行『UPDATE table_name SET file_data=$bin_data where id=2;』
↓
これでデータベースに登録される。さらに
↓
SQL発行『SELECT * from table_name where id=2;』
↓
$data=mysql_fetch_array()で$data配列にデータが格納された行が取得できる。
↓
あとは、入れたときの逆でクォートを取り除いて、Base64でデコードすればバイナリデータが取得できる。
↓
$data['file_data'] = base64_decode(stripslashes($data["file_data"]));
↓
あとはPDFファイルだったら、
↓
header("Content-type:application/pdf");
echo $data["file_data"];
で出力だ。どーだ!
すげー簡単にやったように書いているが、実は帰宅してからあーでもない、こーでもないと試行錯誤した結果、5時間後にやっとできたという事実は、大人だったら見て見ぬふりをするトコロだ。
ここまで書いといてなんだけど、パフォーマンスを考えると遅くなるのは明白だし、何よりデータベースの領域を激しく食らう可能性があるので、この手法はヤメることにした。代わりにファイル名だけ格納して、実ファイルはサーバ上のウェブ公開していないディレクトリに一元格納して、phpファイルにアクセスがあったらGET引数を見てそこから取り出すという手法をとることにした。今決めた。俺が決めた。俺が仕様だ文句あるか!
本日のツッコミ(全3件) [ツッコミを入れる]
_ いしい 『アブネー! 仕事用テストサーバ内のテストページで作ってたphpinfo()のRefererにココのURLが載ってた!速攻でaccess_logから...』
_ tailup 『金曜日に君と晩ご飯を食べた際に財布をなくしたことが発覚しました。いったいどこにあるんだ~』
_ いしい 『うーん、ままや以外に考えられまい。行動範囲はさほど広くなかったはずだから、モイチド調べてみ。』