在 PostgreSql 中,有一个表,其中有一列类型为 'bytea',带有 jpeg。 在 pgAdmin 中,此列显示为 [二进制数据]。 在 php 脚本中,我需要从该列获取二进制数据并将其转换为 base64 字符串以将其传递给 json 对象。
$pdo = new PDO($dsn);
$query = 'select image from image where bid=' . $id . ';';
$stm = $pdo->query($query);
$ok = $stm->execute();
$ok = $stm->bindColumn('image', $lob, PDO::PARAM_LOB);
$ft = $stm->fetch(PDO::FETCH_BOUND);
if ($ft && is_resource($lob))
{
//content of $lob: resource id='10' type='stream'
$stream = $pdo->pgsqlLOBOpen($lob, 'r');
}
/*
Exception has occurred.
TypeError: PDO::pgsqlLOBOpen(): Argument #1 ($oid) must be of type string, resource given
I've tried replacing $lob with strings like this: '10' or 'id=10' but got an error.
*/
据我所知,当您的 LOB 存储在专用 LOB 存储中时,需要 pgsqlLOBOpen() 。在这种情况下,您必须遵循手册页上的代码。
但是当它存储在表中时,你只需将其取出即可。只需要从流中读取它即可。
// Note that you should always use placeholders
// instead of stuffing any data right into the query!
$query = 'select image from image where bid=?';
$stmt = $pdo->prepare($query);
$stmt->execute([$id]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
现在
$row['image']
中有一个资源类型变量。因此,在资源中时,请像资源人那样做:
如果您需要将其作为变量获取(例如对其进行base64编码)
$image = stream_get_contents($row['image']);
如果您需要将其存储为文件
$fp = fopen('image.png', 'w');
stream_copy_to_stream($row['image'], $fp);
如果您需要将其直接流式传输到输出中
fpassthru($row['image']);