LoginSignup
1
0

More than 1 year has passed since last update.

laravelでPostgreSQLのbyteaに画像を格納したときのメモ

Posted at

<<環境>>
・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を使わなくても実装できないかこれから試行。

参考
https://symfoware.blog.fc2.com/blog-entry-1267.html

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0