PHPで、DBにバイナリで保存してある拡張子不明(JPGかPNG)の画像を、file_put_contents()を使って任意のパスに保存したいです。
PHPで、DBにバイナリで保存してある拡張子不明(JPGかPNG)の画像を、file_put_contents()を使って任意のパスに保存したいです。 どうにもうまくいかないので、書き方を教えていただけないでしょうか。 保存はできても、破損して開けないJPGができたりします。
PHP・35閲覧・25
1人が共感しています
ベストアンサー
DBへの接続自体は理解されていますよね? PDO接続($pdo)がすでにあり、テーブルからの抽出条件には外部からのデータが関与しない(prepare/executeでエスケープの要がない)と仮定するなら $stmt = $pdo->query('select * from テーブル名 where (抽出条件)'); $row = $stmt->fetch(); $imgdata = $row['image']; とかで画像のバイナリ自体は取得できますよね? 保存した画像ファイルへのアクセスに対して(Apacheなどの)webサーバが正しいmimetypeを返すように、データの内容によって適切な拡張子を付与します。 $info = getimagesizefromstring($imgdate); if ($info[2] === IMAGETYPE_PNG) $ext = '.png'; if ($info[2] === IMAGETYPE_JPEG) $ext = '.jpg'; if (isset($ext)) file_put_contents('image/' . md5($imgdata) . $ext, $imgdata); else $errmsg = '画像データが不正です'; 保存するファイル名はお好みで・・・ phpスクリプトから画像を返すなら、 header('content-type: ' . $info['mime']); exit($imgdata); でいいんですけどね。
1人がナイス!しています
ちなみに \u003eDBにバイナリで保存してある拡張子不明(JPGかPNG)の画像 という時点で「どういう設計なのか」が問題になると思います。 普通ならファイルとして保存してそのまま使えるように(そのファイル名をDBに記録)しますし、バイナリをDBに格納するときにはDBから取り出して画像データを(直接)返す前提になるのでブラウザに返すべきmimetype(に必要な情報)も記録します。 画像が必要になるたびに「file_put_contentsで書き出す」とか「画像データから画像の種類を判定する」のは無駄でしかありません。 DBにバイナリがあるというなので、「DBから返す」前提で作ってるけどmimetypeのカラムがなかったので(カラムを作成して)phpで判定して更新する(以降はレコード作成時に記録する)とかならいいんですが・・・
質問者からのお礼コメント
ありがとうございます!解決しました!! 大変助かりました!!
お礼日時:1/21 18:27