3

保存された画像「bytea」タイプのpostgresデータベースがあり、PHPを使用してブラウザーに表示しようとしています。そのうちの 1 つを表示する方法を見つけましたが、複数表示することはできません。私が使用するコードは次のとおりです。

ファイル名 - 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;

問題は、1 つの画像のみを表示する「tmp.jpg」仮想ファイルにあるようです。クエリの結果が 7 つの画像の場合、while ループ内で同じ画像が 7 回表示されます。どうすればこれを解決できますか? 関心をお寄せいただきありがとうございます。

4

1 に答える 1

4

私は少し前にbyteaのためにこれをしました。

pg_unescape_byteaを介してbyteaデータを実行する必要があります。http://php.net/manual/en/function.pg-unescape-bytea.phpを参照してください

基本的に、SQLクエリはエスケープされた形式でbyteaフィールドを返します。

しかし、これはあなたがしていることではありません。そして、上記は、ビテアの助けを求めてここに来る次の貧しい樹液のためのものです。BYTEAではなくLOBを使用していることに注意してください。

また、コードには同時実行性が安全ではないことに注意してください。2人のユーザーが異なる画像をリクエストした場合、両方のユーザーが異なる画像を取得するようになると思います。このため、取得URLにOIDを追加し、ファイルに/tmp/$oid.jpgという名前を付ける必要があります。ここで、$oidはラージオブジェクトのOIDです。その情報を取得する必要があります(マップの画像フィールドに保存されているように見えますか?)。一方、それはすべてのファイルが本質的に公開されていることを前提としています。そうでない場合は、すべてをshow_image.phpに移動し、完了したらクリーンアップする必要があります。

于 2012-09-05T09:46:10.173 に答える