无法使用Varbinary Max使用PHP PDO从Sql Server显示图像

时间:2016-12-23 17:16:23

标签: php sql-server image pdo varbinarymax

我一直绞尽脑汁试图弄清楚为什么使用Php PDO无法显示图像,因为它存储在Sql Server 2016中作为Varbinary Max字段。我使用Php 7,并使用相同的代码,但使用MySql在Php 5上工作。我想转而使用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标签中不起作用。它显示的只是破碎的图像图标,但是当您查看页面的源代码时,它会在图像中的数据:标记之后显示数据。

即使在这里,我已经全神贯注地寻找解决方案,但没有任何作用。我怀疑它可能与fetch但不知道为什么,因为网上关于此的文档有限。

帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

我只想玩我发现的一些想法就明白了,

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

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

另外header()方法不起作用它给出了黑屏和图像无法显示firefox上的错误原因。我之前尝试过同样的问题。我不知道为什么它适用于某些而不是在这里。