отображение изображения, хранящегося в BLOB-объекте MySQL - PullRequest
12 голосов
/ 03 апреля 2011

когда я запускаю приведенный ниже код, он отображает изображение, которое хранится в базе данных mysql в виде переменной blob.Проблема в том, что если я повторю что-нибудь еще, даже что-нибудь простое, например, echo '--------';прежде чем я вызову изображение, изображение не будет отображаться.отображаются только случайные символы.если я повторяю что-либо после изображения, изображение отображается, но ничего не происходит после него.Может кто-нибудь сказать мне, почему это так и как я могу показать другие элементы и изображение вместе, спасибо

<?php

include("inc/library.php");

connectToDatabase();

$sql = "SELECT * FROM theBlogs WHERE ID = 1;";

$result = mysql_query($sql) or die(mysql_error());  
$row = mysql_fetch_array($result);

header("Content-type: image/jpeg");
echo $row['imageContent'];
$db->close();

?>

Ответы [ 3 ]

27 голосов
/ 03 апреля 2011

Вы можете преобразовать данные изображения в base64 и вставить его в тег <img>.В настоящее время вы пытаетесь написать текст вне данных изображения, и интернет-браузер считает, что ваш текст является частью изображения, и поэтому выдает ошибку.

Попробуйте что-то вроде этого:

echo '<img src="data:image/jpeg;base64,' . base64_encode( $row['imageContent'] ) . '" />';
echo 'Hello world.';

Обратите внимание, что это не лучшее решение, потому что оно не может быть кэшировано и довольно медленно, особенно на мобильных телефонах.Проверьте caniuse для URI данных .

9 голосов
/ 03 апреля 2011

Ну ... ответ на вопрос, почему он будет делать то, что вы описали, заключается в использовании вами функции header (). В PHP вы ничего не можете напечатать до вызова заголовка, поскольку это заставляет веб-сервер подготовить заголовок содержимого. Обычно они полностью заменяют весь контент.

Во-вторых, я хотел бы отметить, что хранение изображений в базе данных обычно является плохой идеей по двум причинам.

  1. Это оказывает существенное влияние на производительность и рендеринг.
  2. Вы должны написать код для отображения данных BLOB, а не просто для отображения самого изображения.

Предпочтительным способом представления изображений на основе базы данных будет то, что вы будете хранить изображения в каталоге, а их имена файлов - в базе данных. Теперь, когда вы хотите отобразить изображения, вам просто нужно запросить в БД имена файлов, которые вы хотите отобразить, а затем просто включить имя файла в атрибут HTML.

Выполнение также намного быстрее.

Кроме того, я хотел бы отметить, что если вы хотите, чтобы скрипт фактически выполнял рендеринг, вы бы хотели, чтобы этот скрипт определял ваш заголовок, а затем отображал или выводил на экран изображение большого двоичного объекта после того, как вы определите заголовок.

Обратите внимание, что при создании html-тега ... который в атрибуте src вы бы сделали его более похожим на это;

<img src="image.php?id=<some_number>">

Теперь ваш файл image.php будет выплевывать данные изображения в тег.

3 голосов
/ 03 апреля 2011

Просто идея, может быть, вы можете отделить логику для отображения изображения из контента.Я имею в виду, что вы можете создать файл, подобный pic.php, который принимает идентификатор / имя файла (не уверен, если вы используете имена файлов или идентификаторы для ссылки на изображение), а затем отображает изображение.Тогда вы можете просто добавить изображения в ваш HTML, например, сделав что-то вроде этого:

<p>my content</p>
<img src="pic.php?picid=1" />
<p>my Other Content</p>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...