Извлечение данных изображения BLOB из MySQL в PHP - PullRequest
3 голосов
/ 10 марта 2012

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

$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

Ответы [ 3 ]

6 голосов
/ 10 марта 2012

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

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

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

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

2 голосов
/ 10 марта 2012

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

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

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

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

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

Только мои 2 цента, надеюсь, это поможет!

Удачи!

0 голосов
/ 09 января 2015

На самом деле, лучший подход - это иметь 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-инъекций.

...