Как отобразить изображение из BLOB-объекта MySQL - PullRequest
1 голос
/ 19 ноября 2009

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

Я пробовал:

  • header("Content-type: $type"); img src = $blobData;

  • header("Content-type: $type"); echo($blobData);

Ответы [ 4 ]

3 голосов
/ 19 ноября 2009
<?php
  header("Content-type: $type");
  echo $blobData;
?>

Этот код выглядит отлично. Тем не менее, я услышал аналогичную жалобу от другого человека и смог устранить ее, убедившись, что:

  1. Скрипт php не выводит никаких дополнительных символов до или после отправки двоичных данных изображения.

  2. Сценарий php сохраняется как чистый текстовый файл ASCII, а не как файл в кодировке Unicode / UTF-8. Файлы PHP в кодировке Unicode / UTF-8 могут содержать подпись в качестве первых байтов. Эти байты будут невидимы в вашем текстовом редакторе, но сервер отправит эти несколько дополнительных байтов в браузер до данных JPEG / GIF / PNG. Поэтому браузер найдет неверную подпись в начале данных. Чтобы обойти это, создайте пустой текстовый файл в блокноте, вставьте код php и сохраните файл в кодировке ANSI.

1 голос
/ 19 ноября 2009

Другой вариант, который вы могли бы рассмотреть (если вы используете Apache):

Создайте файл .htaccess с mod_rewrite для всех расширений изображения (png, jpg, gif).

Переадресация на php-скрипт, который ищет изображение, запрашиваемое в БД. Если это там, это выводит заголовок и БЛОГ. Если его там нет, возвращается стандарт 404.

Таким образом, вы можете иметь:

<img src="adorablepuppy.jpg" />

Который затем перенаправляется аля:

RewriteEngine on
RewriteRule \.(gif|jpg|png)$ imagelookup.php

Этот скрипт выполняет запрос к изображению, который (очевидно) предполагает, что запрашиваемое изображение имеет уникальный ключ, соответствующий имени файла в URL:

 $url = $_SERVER['REQUEST_URI'];
 $url_parts = explode("/", $url);
 $image_name = array_pop($url_parts);

Теперь у вас есть только имя файла изображения. Сделайте запрос (который я оставлю на ваше усмотрение, вместе с любыми методами проверки и проверки реальных файлов по адресу и т. Д.).

Если получится результат:

 header('Content-type: image/jpeg');
 header('Content-Disposition: inline; filename="adorablepuppy.jpg"');
 print($image_blog);

в противном случае:

 header("HTTP/1.0 404 Not Found");

К вашему сведению: я понятия не имею, будет ли это плохо с точки зрения производительности. Но это позволило бы вам делать то, что я думаю, что вы хотите, то есть выводить изображение, как если бы это был плоский файл изображения на сервере, используя простой элемент image. Я склонен согласиться с тем, что BLOB - не лучший способ, но это позволяет избежать кросс-браузерных проблем.

1 голос
/ 19 ноября 2009

Я считаю, что проблема, с которой вы сталкиваетесь, связана с кодировкой. Этот ресурс утверждает, что вы можете использовать функцию печати. ​​

0 голосов
/ 19 ноября 2009

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

$image = mysql_fetch_array(...)
header("Content-type: image/jpeg"); // change it to the right extension 
print $image['data'];

По соображениям производительности ... это не рекомендуется. Существует несколько причин для размещения изображений в базах данных, но наиболее распространенными являются:

а) держать их в индексе (дух!)
Вы можете сделать это, сохраняя изображения на сервере и просто индексируя имя файла изображения.

b) скрытие / защита изображения
Flickr и другие по-прежнему хранят изображения на сервере и используют другой подход. Они генерируют URL, который трудно найти.

Эта ссылка указывает на защищенное изображение в моей учетной записи. Вы по-прежнему можете получить к нему доступ, если знаете правильный URL-адрес. Попробуйте!

farm2.static - ферма , оптимизированная для доставки статического контента
1399 - возможно сервер
862145282 - мое имя пользователя
bf83f25865_b - изображение

Чтобы найти все мои секретные изображения, любой пользователь может нажать Flickr по указанному выше адресу и изменить последнюю часть. Но это заняло бы целую вечность, и пользователь, вероятно, был бы заблокирован за то, что он забил сервер тысячами 404.

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

Редактировать:
Просто ссылка, указывающая на кого-то, кто объяснил намного лучше, чем я , почему BLOB не подходит для хранения при хранении изображений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...