4

我为此工作了好几个小时。在网上找到的解决方案很少,但似乎没有人能帮助我。我在使用 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);
    }
}

我很欣赏对此的一些解释,因为在研究和阅读之后我仍然感到困惑。

4

2 回答 2

1

最后我找到了方法。根据我在使用 PDO处理二进制数据中发现的内容,因为我正在使用 PDO 读取 DB 中的列。

所以我把这两行放在我的foreach循环中:

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

我的文件显示得很好。正如@Musa 指出的那样,我一次只能打印一张图像,所以我将使用imgwithsrc="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(). 希望这可以帮助那里的人们。谢谢。

于 2015-10-23T03:03:09.343 回答
0

假设$product->binarydataBYTEA列中获取内容,此方法确实有效:

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

除非此答案escape中提到的客户端/服务器版本不匹配,否则应使用 bytea的格式。

代码不得输出除上述两行之外的任何内容。

于 2015-10-22T13:45:27.003 回答