Я застрял на несколько часов, работая над этим. В сети найдено несколько решений, но мне никто не помогает. У меня проблема с отображением изображения в браузере с помощью 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);
}
}
Я ценю некоторые объяснения этого, потому что я все еще смущен после исследования и чтения.
При условии, что $product->binarydata
содержимое получено из BYTEA
столбец, этот метод работает:
header('Content-type: image/png');
echo pg_unescape_bytea($product->binarydata);
кроме случаев, когда упомянутое в этот ответ, в этом случае escape
формат для bytea должен быть использован.
Код не должен выводить ничего, кроме двух строк выше.
Наконец-то я нашел способ сделать это. Основываясь на том, что я нашел в Обработка двоичных данных с помощью 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()
, Надеюсь, что это помогает людям там. Благодарю.