0

我一直在绞尽脑汁试图弄清楚为什么使用 Php PDO 无法显示图像,并将其作为 Varbinary Max 字段存储在 Sql Server 2016 中。我使用 Php 7,并使用相同的代码在 Php 5 上运行,但使用的是 MySql。我想改用 Sql Server。

当我显示它时,我得到的只是一个损坏的图像,但在源代码中它显示了图像数据。它是使用 base64 编码的,我使用 while 循环来获取记录。我的代码如下。

插入效果很好,我可以在数据库中查看图像。

$sql1 = "INSERT INTO weather_stories (filedate, text, imgfile)
                VALUES (:filedate, :text, :imgfile)";
    $preparedStatement = $conn->prepare($sql1);
    $preparedStatement->bindParam(':filedate', $_POST['filedate']);
    $preparedStatement->bindParam(':text', $_POST['text']);
    $preparedStatement->bindParam(':imgfile', $output, PDO::PARAM_LOB, 0, PDO::SQLSRV_ENCODING_BINARY);
    $preparedStatement->execute();

显示图像:

$sql = "SELECT TOP (2) id, filedate, imgfile, text, adddatetime, CONCAT(ROUND(DATALENGTH(imgfile)/1024, 1), 'k') as size
            FROM weather_stories
            ORDER BY adddatetime DESC";
  // use exec() because no results are returned
  $preparedStatement = $conn->prepare($sql);

  $preparedStatement->execute();

    //retrieve records
    while ($row = $preparedStatement->fetch())  {

        //create table
        echo "<tr>";
        echo "<td>" . $row['filedate'] . "</td>";
        echo "<td>" . $row['text'] . "</td>";
        echo "<td>" . $row['adddatetime'] . "</td>";
        echo "<td>" . $row['size'] . "</td>";
        echo "</tr>";
        echo "<tr>";
        echo "<td><a href='viewws.php?id=" . $row['id'] . "'>";
        echo "<img width='300' height='300' src='data:image/png;base64," . base64_encode($row['imgfile'])  . "' />";

        echo "</a></td>";
        echo "<td><a href='#' id=" . $row['id'] . " class='deletews'>Delete</a></td>";
        echo "</tr>";
    }

我不明白为什么这在 img 标签中不起作用。它显示的只是损坏的图像图标,但是当您查看页面的源代码时,它会在数据之后显示数据:图像中的标记。

即使在这里,我也已经到处寻找解决方案,但没有任何效果。我怀疑它可能与获取有关,但不知道为什么,因为网络上关于此的文档有限。

帮助将不胜感激。谢谢!

4

1 回答 1

0

我只是通过玩一些我发现的想法来解决的,

echo '<img src="data:image/png;base64,' . base64_encode(hex2bin($row['imgfile']))  . '" >';

图像必须是 hex2bin 1st,然后是 base64 编码,现在它可以正确显示图像。我以为我以前试过这个但它没有用,除非我错过了什么,但我希望有一个更简单的方法。

header() 方法也不起作用,它会出现黑屏,并且无法显示图像,导致 firefox 出现错误。我之前尝试过同样的问题。我不知道为什么它适用于某些而不是在这里。

于 2016-12-23T20:30:36.767 回答