Вытягивание данных изображения BLOB из MySQL в PHP

Я читал из нескольких уроков о том, как загрузить изображение в базу данных в виде двоичного кода, против того, чтобы поместить их на сервер, и я получил его, чтобы он работал следующим образом:

PHP:

$image = chunk_split(base64_encode(file_get_contents($tmpfile))); mysql_query("INSERT INTO images (`img_location`, `caption`, `user`, `genre`, `when`) VALUES ('$image', '$caption', '$id', '$genre', '$when')"); 

Моя проблема заключается в том, как вы теперь извлекаете ее из базы данных, я прочитал несколько способов сделать это, попробовал их всех, не могу понять, я не получаю ошибку MySQL, вот как я ее пытаюсь :

 $get_pics = mysql_query("SELECT * FROM images WHERE user='$id' "); while($get_pics2 = mysql_fetch_array($get_pics)) { $sixfour_enc = base64_decode($get_pics2['img_location']); $new .= "<img src=\"".$sixfour_enc."\" >"; } 

Это работает … вроде, что происходит, так это то, что он печатает двоичные файлы в теге IMG.

Как мне это сделать, чтобы снова скомпилировать образ для чтения? Кроме того, хранит изображения в базе данных глупо? Должен ли я просто делать то, что я обычно делаю, и хранить их на сервере?

Спасибо -mike

Вы можете хранить изображения в своей базе данных, если хотите (хотя нет ничего плохого в том, что просто сохраняйте их как файлы, выберите то, что подходит в вашей ситуации), но сохраните необработанные двоичные данные в BLOB (т. Е. Не кодируйте его с помощью base64). Вы можете вставлять двоичные данные, которые вы получаете из file_get_contents в свой запрос напрямую, при условии, что сначала вы используете правильную функцию escape ( mysql_real_escape_string в вашем случае).

Что касается вывода изображения, вы можете сделать это так, как вы делаете это прямо сейчас, но вам придется выводить его base64-кодирование и с помощью схемы URI data :

 echo '<img alt="embedded image" src="data:image/png;base64,' . chunk_split(base64_encode($get_pics2['img_location'])) . '">'; 

Обратите внимание, что есть некоторые преимущества и недостатки данных встроенных изображений. Некоторые важные недостатки, о которых следует помнить, – это тяжелые накладные расходы на кодирование base64 (примерно на 33% больше оригинала) и потенциальные проблемы с кешированием.

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

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

Кроме того, поля BLOB в таблицах MySQL значительно больше, чем другие таблицы с точки зрения размера, и выполняют большинство операций в большинстве сценариев.

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

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

Просто мои 2 цента, надеюсь, это поможет!

Удачи!

На самом деле, лучший aproach – иметь скрипт PHP для вывода двоичного файла изображения с соответствующими заголовками (скажем, getimage.php), а сценарий, используемый для генерации HTML, будет иметь такой код:

 $get_pics = mysql_query("SELECT id FROM images WHERE user='$userid' "); while($imglist = mysql_fetch_array($get_pics)) { $new .= '<img src="getimage.php?id='.$imglist['id'].'" title="'.$imglist['caption'].'" />'; } 

Таким образом, HTML будет выглядеть так:

 <img src="getimage.php?id=12345" title="the caption of" /> 

У вас должен быть первичный ключ (почему бы и нет?) На images таблицы, скажем, id .

Сценарий « getimage.php » должен извлекать двоичный файл и выводить содержимое (при условии, что поле img_location содержит фактическое содержимое изображения:

 <?php // this will output the RAW content of an image with proper headers $id=(int)$_GET['id']; $get_img = @mysql_fetch_assoc(@mysql_query("SELECT img_location FROM images WHERE id='$id' ")); $image = imagecreatefromstring(base64_decode($get_img['img_location'])); if ($image){ //you may apply here any transformations on the $image resource header("Content-Type: image/jpeg"); //OR gif, png, whatever imagejpeg($image,null,75); //OR imagegif, imagepng, whatever, see PHP doc. imagedestroy($image); //dump the resource from memory } exit(); @mysql_close(); ?> 

Такой подход даст вам гибкость. Однако вам может потребоваться проверить и дезинформировать переменные и выбрать другой метод подключения к MySQL, как MYSQLi или PDO. Еще одна хорошая идея – использование подготовленных операторов для предотвращения инъекций SQL.