Я читал из нескольких уроков о том, как загрузить изображение в базу данных в виде двоичного кода, против того, чтобы поместить их на сервер, и я получил его, чтобы он работал следующим образом:
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.