Отображение изображения, сохраненного в двоичном виде в столбце Postgre bytea

Я застрял на несколько часов, работая над этим. В сети найдено несколько решений, но мне никто не помогает. У меня проблема с отображением изображения в браузере с помощью PHP, который берет изображение из Postgres DB с типом столбца bytea. Я уверен, что я что-то здесь упускаю. Так что некоторые рекомендации действительно ценятся. Итак, у меня есть этот код ниже:

$prod = new Product();
$prod->display_latest_product();
if( $prod->exists() ){
    $products = $prod->data();
    foreach($products as $product){
        echo $product->id;
        echo $product->binarydata;

        /* Solution below: I only get one image with broken link */
        header('Content-type: image/png');
        echo pg_unescape_bytea($product->binarydata);

        /* Solution below: I only get one image with broken link */
        header('Content-Type: image/png'); 
        $data=fgets($product->binarydata); 
        print(pack('H*',$data));

        /* bin2hex() expects parameter to be string but resource given */
        echo bin2hex($product->binarydata);

         /* Solution below: I only get one image with broken link */
        $image = stripcslashes($product->binarydata);
        header("Content-Type: image/png");
        print($image);
    }
}

Я ценю некоторые объяснения этого, потому что я все еще смущен после исследования и чтения.

2 ответа

Решение

Наконец-то я нашел способ сделать это. Основываясь на том, что я нашел в Обработка двоичных данных с помощью PDO, поскольку я использую PDO для чтения столбца в БД.

Я положил эти две строки в свой foreach цикл:

header("Content-Type: ".$product->mimetype);
fpassthru($product->binarydata);

И мой файл отображается красиво. Как @Musa указал, что я могу печатать только одно изображение за раз, поэтому я собираюсь использовать img с src="thepage.php?img=xx" просто чтобы отобразить изображение. Я занимаюсь разработкой приложения электронной коммерции, поэтому не уверен, что это может повлиять на производительность, поскольку будет загружено много изображений. Любые комментарии или предложения приветствуются. В любом случае, я надеюсь, что это может помочь людям, у которых возникла такая же проблема.

Документация по fpassthru здесь

РЕДАКТИРОВАТЬ:: РЕШЕНИЕ НАЙДЕНО

Итак, я наконец-то нашел реальное решение, которое решает мою проблему, определенное в комментарии ниже. И на этот раз это не связано PHP header совсем.

foreach($products as $product){
    ob_start(); // Let's start output buffering.
    fpassthru($binarydata); //This will normally output the image, but because of ob_start(), it won't.
    $contents = ob_get_contents(); //Instead, output above is saved to $contents
    ob_end_clean(); //End the output buffer.

    $dataUri = "data:image/png;base64," . base64_encode($contents);
    echo "<img src='$dataUri' />";
}

У меня есть решение здесь. И основываясь на комментариях в этой теме, трюк на самом деле заключается в буферизации. ob_start должен использоваться в паре с ob_end_clean(), Надеюсь, что это помогает людям там. Благодарю.

При условии, что $product->binarydata содержимое получено из BYTEA столбец, этот метод работает:

    header('Content-type: image/png');
    echo pg_unescape_bytea($product->binarydata);

за исключением случаев, когда в этом ответе указано несоответствие версии клиент / сервер, и в этом случае escape формат для bytea должен быть использован.

Код не должен выводить ничего, кроме двух строк выше.

Другие вопросы по тегам