DIsplay image(bytea) from postgresql with php


DIsplay image(bytea) from postgresql with php

我有一个带有存储图像"bytea"类型的postgres数据库,我尝试将它们显示到带有PHP的浏览器中。我找到了显示其中一个的方法,但我不能制作多个。我使用的代码如下:

文件名 - display_image.php

$conn = pg_connect("dbname=test user=postgres password=postgres");
$temp = '/home/postgres/tmp.jpg';
$query = "select lo_export(image, '$temp') from map ";
$result = pg_query($query);
if($result)
{
    while ($line = pg_fetch_array($result))
    {
        $ctobj = $line["image"];
        echo "<IMG SRC=show.php> </br>";
    }
}
else { echo "File does not exists."; }
pg_close($conn);

文件名 - 显示.php

header("Content-type: image/jpeg");
$jpeg = fopen("/home/postgres/tmp.jpg","r");
$image = fread($jpeg,filesize("/home/postgres/tmp.jpg"));
echo $image;

问题似乎是仅显示一个图像的"tmp.jpg"虚拟文件。如果查询的结果是 7 张图像,则它在 while 循环中显示 7 次相同的图像。我该如何解决这个问题?感谢您的关注!

我前段时间为bytea做了这个。

您需要通过pg_unescape_bytea运行bytea数据。 见 http://php.net/manual/en/function.pg-unescape-bytea.php

基本上,您的 SQL 查询以转义格式返回 bytea 字段。

然而,这不是你正在做的。所以以上只是给下一个来这里寻求茶叶帮助的可怜的树汁。 请修改以注意您使用的是LOB而不是BYTEA。

另请注意,您的代码不是并发安全的。 如果两个用户请求不同的图像,我的猜测是你会让两个用户获得不同的图像。 出于这个原因,你应该将 oid 添加到检索 url 中,并将你的文件命名为/tmp/$oid.jpg其中 $oid 是大对象的 oid。 您将需要检索该信息(我相信它看起来像存储在地图的图像字段中? 另一方面,假设所有文件基本上都是公开的。 如果不是这种情况,您希望将所有内容都移到show_image.php中,并在完成后进行清理。