我一直绞尽脑汁试图弄清楚为什么使用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但不知道为什么,因为网上关于此的文档有限。
帮助将不胜感激。谢谢!
答案 0 :(得分:0)
我只想玩我发现的一些想法就明白了,
echo '<img src="data:image/png;base64,' . base64_encode(hex2bin($row['imgfile'])) . '" >';
图像必须是hex2bin 1st然后是base64编码,现在它正确显示图像。我以为我之前尝试过这个并没有用,除非我错过了什么,但我希望有一个更简单的方法。
另外header()方法不起作用它给出了黑屏和图像无法显示firefox上的错误原因。我之前尝试过同样的问题。我不知道为什么它适用于某些而不是在这里。