ZetCode

在PostgreSQL中使用PHP处理图像

最后修改于 2020 年 7 月 6 日

在本PostgreSQL PHP教程的这一章中,我们将处理图像文件。 有些人不同意将图像放入数据库。 这里我们只展示如何去做。 我们不深入探讨是否将图像保存在数据库中的技术问题。

testdb=> CREATE TABLE images(id INT PRIMARY KEY, data BYTEA);

对于这个例子,我们创建一个名为 images 的新表。 对于图像,我们使用 BYTEA 数据类型。 它允许存储二进制字符串。

插入图像

在第一个例子中,我们将向PostgreSQL数据库中插入一个图像。

<?php 

$host = "localhost"; 
$user = "user12"; 
$pass = "34klq*"; 
$db = "testdb"; 

$con = pg_connect("host=$host dbname=$db user=$user password=$pass")
    or die ("Could not connect to server\n");

$file_name = "woman.jpg";

$img = fopen($file_name, 'r') or die("cannot read image\n");
$data = fread($img, filesize($file_name));

$es_data = pg_escape_bytea($data);
fclose($img);

$query = "INSERT INTO images(id, data) Values(1, '$es_data')";
pg_query($con, $query); 

pg_close($con); 

?>

我们从当前工作目录读取一个图像,并将其写入PostgreSQL testdb 数据库的 images 表中。

$file_name = "woman.jpg";

这是我们要插入到数据库中的图像文件的名称。 图像位于当前工作目录中。

$img = fopen($file_name, 'r') or die("cannot read image\n");
$data = fread($img, filesize($file_name));

我们从文件系统中读取二进制数据。

$es_data = pg_escape_bytea($data);

二进制数据可能包含字符,这些字符在插入数据库表时可能会导致问题。 pg_escape_bytea 函数会转义字符串,以便插入到 bytea 字段中。 稍后,从数据库中读取二进制数据时,必须对数据进行反转义。

fclose($img);

指向图像文件的句柄被关闭。

$query = "INSERT INTO images(id, data) Values(1, '$es_data')";
pg_query($con, $query); 

图像被插入到数据库中。

读取图像

在本节中,我们将执行相反的操作。我们将从数据库表中读取一张图像。

<?php 

$host = "localhost"; 
$user = "user12"; 
$pass = "34klq*"; 
$db = "testdb"; 

$con = pg_connect("host=$host dbname=$db user=$user password=$pass")
    or die ("Could not connect to server\n");

$query = "SELECT data FROM images WHERE id=1";
$res = pg_query($con, $query) or die (pg_last_error($con)); 

$data = pg_fetch_result($res, 'data');
$unes_image = pg_unescape_bytea($data);

$file_name = "woman2.jpg";
$img = fopen($file_name, 'wb') or die("cannot open image\n");
fwrite($img, $unes_image) or die("cannot write image data\n");
fclose($img);

pg_close($con); 

?>

我们从 images 表中读取图像数据,并将其写入另一个文件,我们称之为 woman2.jpg

$query = "SELECT data FROM images WHERE id=1";

这一行是一个 SQL SELECT 语句,用于从表中检索图像数据。

$data = pg_fetch_result($res, 'data');

我们从 images 表的 data 列中提取数据。

$unes_image = pg_unescape_bytea($data);

当我们把图像数据插入到数据库时,我们对其进行了转义。 现在我们必须将其反转义回原始状态。

$file_name = "woman2.jpg";
$img = fopen($file_name, 'wb') or die("cannot open image\n");

我们打开一个文件用于写入。 新的文件名将是 woman2.jpg

fwrite($img, $unes_image) or die("cannot write image data\n");

数据被写入文件系统。

PostgreSQL PHP教程的这一部分专门用于读取和写入图像。