<<環境>>
・PHP 7.4
・laravel8
・PostgreSQL12
PostgreSQLのbytea型に画像データを保存する必要が出て、
クエリービルダでうまく行かずにPDOを使用して実装した際の処理内容です。
テーブルには
・ID
・バイナリデータ(img_bin)
・MimeType(mimetype)
・ファイル名
のカラムを持つ前提で、データの挿入を行います。
$id = レコードのID
$file = $request->file('file'); // リクエストのファイルを取得
$org_logo_filename = $file->getClientOriginalName(); // アップされたオリジナルのロゴファイル名取得(デバッグ等で使用)
$mimetype = $file->getClientMimeType(); // 画像を表示する際のmimetypeとして使用
$tmp_path = $file->getRealPath(); // 実画像のパスを取得
$fp = fopen($tmp_path, 'rb'); // 画像ファイルのファイルポインタ取得
// PDOを使ってデータの挿入
$db = DB::connection('pgsql')->getPdo(); // PDOオブジェクト取得
$db->setAttribute($db::ATTR_ERRMODE, $db::ERRMODE_EXCEPTION);
$stmt = $db->prepare("INSERT INTO simple_location_prop VALUES (?,?,?,?)");
$stmt->bindParam(1, $id);
$stmt->bindParam(2, $fp, $db::PARAM_LOB);
$stmt->bindParam(3, $mimetype);
$stmt->bindParam(4, $org_logo_filename);
$stmt->execute();
$arr = $stmt->errorInfo(); // エラー情報の取得
保存したデータを取り出す際は、
$db = DB::connection('pgsql')->getPdo();
$stmt = $db->prepare("SELECT mimetype, img_bin FROM テーブル名 WHERE id=?");
$stmt->execute(array($id));
$stmt->bindColumn(1, $mimetype, $db::PARAM_STR, 256);
$stmt->bindColumn(2, $lob, $db::PARAM_LOB);
$stmt->fetch($db::FETCH_BOUND);
・
・
・
header('Content-Type: ' . $mimetype);
fpassthru($lob);
今回はこれで実装しましたが、PDOを使わなくても実装できないかこれから試行。