Отображение изображения, сохраненного в двоичном виде в столбце 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);
}
}

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

3

Решение

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

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

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

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

0

Другие решения

Наконец-то я нашел способ сделать это. Основываясь на том, что я нашел в Обработка двоичных данных с помощью 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(), Надеюсь, что это помогает людям там. Благодарю.

0