Изображения из базы данных не будут отображаться, заголовки уже отправлены

$sql="SELECT * FROM  `blob` ";
$query=mysql_query($sql);
while($row=mysql_fetch_array($query)) {
    $image=$row ['image'];
    header("content-type: image/jpg");
    echo '<img src="path/'.$image.'" width="360" height="150">';
}

Это код, который я использую для отображения изображения, загруженного в мою базу данных... однако я получаю сообщение об ошибке, что заголовки уже отправлены... я понятия не имею, что я делаю неправильно!

я могу видеть на моем сайте, где мои изображения должны быть, но нет фактического изображения!

3 ответа

Ваш код полностью неверен; хранение изображений в базе данных MySQL - плохая идея, и вы используете данные изображения в качестве пути к несуществующему изображению; если вы все еще хотите придерживаться идеи наличия изображений в вашей базе данных, вот пример кода, который будет работать:

while ($row = mysql_fetch_array($query)) {
    echo '<img src="data:image/jpeg;base64,'.base64_encode($row["image"]).'" />';
}

Это кодирует изображение в base64, а затем использует его в качестве URI данных внутри img; заголовки не нужны.

Также, mysql устарела; используйте вместо этого mysqli или PDO.

В общем: Когда вы получаете это сообщение, кажется, что есть выход, сделанный ранее. Это может быть даже простой символ "пробел", например [:space:].

Но: в дополнение к этому вы, кажется, ошибаетесь. Вы создаете HTML (!), Но отправляете сообщение заголовка, которое сообщает браузеру, что он получает двоичные данные изображения.

Таким образом, когда у вас действительно есть двоичные данные в вашей базе данных, вы должны выводить двоичные данные, а не какие-либо html-файлы. Я действительно рекомендую вам прочитать хорошую книгу о том, как работает сервер и что на самом деле делает заголовок (..).

Пожалуйста, посмотрите здесь:

PS: я не стал вдаваться в подробности вашего вопроса и не дал решения, потому что я не думаю, что это поможет вам, а не решит проблему непонимания временно.

Проблема в том, что вы делаете это в цикле while, который будет выполняться несколько раз:

while($row=mysql_fetch_array($query)) {
    $image=$row ['image'];
    header("content-type: image/jpg"); // Headers are sent here
    echo '<img src="path/'.$image.'" width="360" height="150">'; // Content here
}

Когда вы микшируете заголовки, как это, обычно вы хотите поместить заголовок перед любым содержимым. Однако в вашем случае это не имеет смысла, потому что вы отправляете "content-type: image/jpg", Если вы выводите изображение в браузер с помощью HTML, тип контента должен быть text/html (который отправляется PHP по умолчанию). Так что просто оставьте эту строку полностью. Если вы пытаетесь отправить фактическое двоичное содержимое изображения, то вы не будете использовать тег HTML, просто отправьте Content-Type заголовок, а затем повторить содержимое одного изображения.

Другие вопросы по тегам