Я ломал голову, пытаясь понять, почему изображение не будет отображаться с использованием Php PDO, если оно хранится в Sql Server 2016 как поле Varbinary Max. Я использую 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. Все, что он отображает, это значок разбитого изображения, но когда вы смотрите на исходный код страницы, он показывает данные после тега data: на изображении.
Я искал решение этой проблемы даже здесь, и ничего не работает. Я подозреваю, что это может быть с извлечением, но не знаю почему, так как в Интернете имеется ограниченная документация по этому поводу.
Помощь будет оценена. Спасибо!
Я понял это, просто поиграв с некоторыми идеями, которые нашел,
echo '<img src="data:image/png;base64,' . base64_encode(hex2bin($row['imgfile'])) . '" >';
Изображение должно было быть hex2bin 1st, затем base64-кодированным, и теперь оно отображает изображение правильно. Я думал, что пробовал это раньше, и это не сработало, если я не пропустил что-то, но я хотел бы, чтобы был более легкий путь к этому.
Также не работает метод header (), он дает черный экран, и изображение не может быть отображено из-за ошибок в Firefox. Я пробовал это раньше и та же проблема. Я понятия не имею, почему это работает на некоторых, а не здесь.
Других решений пока нет …