MySQL内に保存された画像を、実ファイルに変換するスクリプト

2018/03/23更新 カテゴリー:開発奮闘記 タグ: , , ,
  • このエントリーをはてなブックマークに追加

実は僕が10年前くらいに作ったWebシステムのいくつかは、データベースにBLOB形式でバイナリファイルを格納していました。データベース内に直接画像を保存することで、検索と連動して処理しやすいようにしたつもりでした。

しかし、実際に運用がはじまるとそんなことはありませんでした。むしろ、データが増えてくるほどに危険性が増してきます。データベースのバックアップデータも肥大化し、SQLでバックアップをとっても、ファイルが数GBともなると、直接ファイルを開いて確認することはできませんし、復元する時にとんでもない労力が発生する可能性があります。

ということから、これまでデータベースに保存していた画像を取り出して、通常の画像ファイルに変更して保存しなおすスクリプトを作りました。それぞれの環境によって適宜変更が必要かと思いますし、流用の際は自己責任でお願いします。

SPONSOR

データベースから画像を抽出するスクリプト

ファイル名を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を使っているのは、一気にスクリプトを走らせて、サーバーが重たくならないよう、タイムアウトがおこらないようにするためです。

フリーランスエンジニアの稼ぎ方

  • このエントリーをはてなブックマークに追加
SPONSOR

PROFILE

プロフィール

入江 慎吾/サービス開発だけで生きていく
15年続けた受託開発をやめ、自分が作ったサービスだけで生きていくことを決意。同じゴールを目指す仲間が集まる入江開発室を運営 / 師弟関係がつくれるサービス「MENTA」をつくりました。
(詳しいプロフィール)

PRODUCT

イリテクで開発したプロダクト

RELATION

関連する記事

SPONSOR

TAG

タグから記事をさがす