MySQL内に保存された画像を、実ファイルに変換するスクリプト
実は僕が10年前くらいに作ったWebシステムのいくつかは、データベースにBLOB形式でバイナリファイルを格納していました。データベース内に直接画像を保存することで、検索と連動して処理しやすいようにしたつもりでした。
しかし、実際に運用がはじまるとそんなことはありませんでした。むしろ、データが増えてくるほどに危険性が増してきます。データベースのバックアップデータも肥大化し、SQLでバックアップをとっても、ファイルが数GBともなると、直接ファイルを開いて確認することはできませんし、復元する時にとんでもない労力が発生する可能性があります。
ということから、これまでデータベースに保存していた画像を取り出して、通常の画像ファイルに変更して保存しなおすスクリプトを作りました。それぞれの環境によって適宜変更が必要かと思いますし、流用の際は自己責任でお願いします。
データベースから画像を抽出するスクリプト
ファイル名をtest.phpとつけた場合の例です。以下の画像を格納しているテーブルはidが連番でつけられていて、pic_fileはBLOB型のバイナリデータが入っています。
<? //データベースに接続 $db = mysql_connect("localhost", "id" ,"pass"); if($db==False) { print "データベースに接続できません。"; exit; } // データベースの選択 if(!mysql_select_db("データベース名",$db) ) { print "データベースが存在しません。"; exit; } if($_GET[num]==""){ $num=0; }else{ $num=$_GET[num]; } ?> <html> <body onload="setTimeout('nextsyori()',2000)"> <form name="form" method="GET"> <input type="text" name="num" value="<? echo $num+1; ?>"> <input type="submit" value="つぎへ"> <? $psql="select * from 画像テーブル order by id limit ".$num.",1"; $presult=mysql_query($psql); $kekka=mysql_num_rows($presult); while($pdata=mysql_fetch_array($presult)){ $filename = 'photo/'.$pdata[id].".jpg"; //ファイルがあればスキップ if (file_exists($filename) && $kekka!=0) { ?> <script> document.form.submit(); </script> <? //ファイルが最後までいけば終了 }elseif($kekka==0){ echo "終了"; //ファイルがなければ画像化 }else{ $fp = fopen($filename, 'wb'); fwrite($fp, $pdata[pic_file]); fclose($fp); } } ?> <script> function nextsyori(){ <? if($kekka!=0){ ?> document.form.submit(); <? } ?> } </script> </form> </body> </html>
画像を格納しているテーブルをid順に1件づつリクエスト。画像ファイルが存在すればスキップして次のidに飛びます。ファイルがなければ、photoフォルダ内にid.jpgというファイル名で画像をつくって、次のidに飛びます。
JavaScriptのsetTimeoutで2秒後にnextsyoriを実行して、フォームを実行して次のidに飛ばしています。データベースのリクエスト結果がなくなれば、画像テーブルの最後の行まで進んだということなので、その時には実行しないようにしています。
setTimeoutを使っているのは、一気にスクリプトを走らせて、サーバーが重たくならないよう、タイムアウトがおこらないようにするためです。
[sc name=”engeneer”]
SPONSER
SHARE
YouTube
Mail Magazine
毎週1回ブログの更新情報をお届けします。登録はこちらから。無料メルマガ特典として「個人開発の教科書<心得編>」をご覧いただけます。
PROFILE
個人開発クリエイター。MENTAなどをはじめ、これまでに30個ほどのサービスやアプリをつくりました。電子書籍「個人開発の教科書」を出版しました。コンサル、開発のご依頼はこちらまで。 (詳しいプロフィール)