用PHP从PostgreSQL显示图像(bytea)

3
我有一个存储图片的postgres数据库,类型为'bytea',我尝试使用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);

文件名 - show.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次相同的图片。我该如何解决这个问题? 感谢您的关注!

请修改备注,说明您正在使用LOB而不是bytea。 - Chris Travers
1个回答

4

我之前曾为bytea做过类似的事情。

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

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

不过这并不是你正在做的事情。因此,以上内容只是给下一个需要bytea帮助的可怜人提供参考。请注意修改说明,表明你使用的是LOB而不是BYTEA。

还要注意,你的代码不具备并发安全性。如果两个用户请求不同的图片,我猜测你会得到两个用户获取不同图像的结果。因此,你应该在检索URL中添加oid,并将文件命名为/tmp/$oid.jpg,其中$oid是大对象的oid。你需要检索那些信息(我相信它们存储在map的image字段中?)。另一方面,这假定所有文件基本上都是公共的。如果不是这样的情况,你就需要将所有内容移动到show_image.php,完成后进行清理。


我一直在Stackoverflow上寻找完整的答案 - 函数pg_unescape_bytea()的功能不如预期。例如,这段代码: $img['data'] = pg_escape_bytea($db, $img['data']); $test = imagecreatefromstring(pg_unescape_bytea($img['data']));你有什么想法?我知道$img['data']包含一个有效的字符串,可以转换为图像。 - Ed Orsi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接