Как внести (вписать) изображение в ячейку базы данных

 Как вывести изображение из базы данных

 

Рано или поздно при создании компонентов возникает вопрос: где и как удобнее хранить изображения? Существует три варианта:

  • хранить в общей папке images сайта;
  • хранить в папке images компонента;
  • хранить в базе данных.

Какой вариант лучше, какой выбрать? В большинстве случаев это зависит от типа компонента, который вы создаёте.

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

Если ваш сайт предполагает установку большого количества фотографий, например, кулинарной тематики, фотоальбомы и так далее, то в этом случае удобнее хранить фото непосредственно в базе данных в соответствующих ячейках;  при этом важно учитывать тип столбца для хранения изображений. Ниже приведены возможные варианты при работе с БД MySQLi.

  • TINYBLOB - максимальная длина 255 байт, сохраняется с однобайтовым префиксом, указывающим длину значения
  • BLOB - максимальная длина 65535 байт, сохраняется с двухбайтовым префиксом, указывающим длину значения
  • MEDIUMBLOB - максимальная длина 16777215 байт, сохраняется с трёхбайтовым префиксом, указывающим длину значения
  • LONGBLOB - максимальная длина 4294967295 байт, сохраняется с четырёхбайтовым префиксом, указывающим длину значения

Как внести (вписать) изображение в ячейку базы данных

Для начала нужно создать в базе столбец с соответствующим типом; назовём его для примера img1. При создании укажите значение по умолчанию как "Нет".

Далее нужно обработать имеющееся изображение. К примеру, вы получили запрос от пользователя, переданный методом POST, содержащий файл изображения.  Такой запрос содержит ассоциативный массив $_FILES, в котором находятся следующие данные:

  • $_FILES['userfile']['name'] - имя файла на компьютере клиента (отправителя);
  • $_FILES['userfile']['type'] - тип файла;
  • $_FILES['userfile']['size'] - размер файла;
  • $_FILES['userfile']['tmp_name'] - временное имя файла на сервере и путь к нему;
  • $_FILES['userfile']['error'] - код возможной ошибки.

Далее нужно обработать запрос следующим образом:

  1   if( !empty( $_FILES['mess_img_1']['name'] ) ) {
  2      if (is_uploaded_file($_FILES['mess_img_1']['tmp_name'])) {
  3         if ( $_FILES['mess_img_1']['error'] == 0 ) {
  4            if( substr($_FILES['mess_img_1']['type'], 0, 5)=='image' ) {
  5               $image_1 = file_get_contents( $_FILES['mess_img_1']['tmp_name'] );
  6               $image_1 = addslashes($image_1);

  7            }
  8         }
  9      }
 10  }

Строка 1 проверяет, существует ли загруженный файл. Если файл существует, то строка 2 при помощи функции is_uploaded_file проверяет, был ли файл загружен при помощи HTTP POST. Это в какой-то степени обеспечивает безопасность загружаемого контента.

Строка 3 проверяет наличие возможной ошибки. Если ошибки нет (код 0), то строка 4 проверяет тип файла; для этого используется функция PHP substr, которая в данном случае отбрасывает всё содержимое переменной начиная с 6-го символа.

 $_FILES['userfile']['type'] указывает тип файла изображения как image/jpeg, image/png и так далее; соответственно при помощи функции substr проверяется соответствие первых пяти символов, т.е. image.

В строке 5 при помощи функции file_get_contents выполняется запись полученного файла изображения (его временное название и временный адрес указаны в переменной $_FILES['mess_img_1']['tmp_name']) в переменную $image_1 в виде строки.

В строке 6 функция addslashes экранирует некоторые символы, имеющиеся в переменной  $image_1 и снова их записывает в эту переменную, но уже со слешами. Экранируются символы ', ", \, NUL.

 Обратите внимание: хотя функция addslashes в какой-то степени защищает систему от так называемых SQL-инъекций, но в PHP не рекомендовано применение данной функции для этой цели. Для обеспечения более надёжной защиты используйте дополнительный код для обработки передаваемых файлов. Подробнее читайте здесь.

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

 

Как вывести изображение из базы данных

Вывод изображения из базы данных осуществляется довольно просто.  В строке кода HTML, в теге <img> прописываем:

<img src="data:image/jpeg;base64,<?php echo base64_encode($image); ?>">

где $image - переменная, содержащая изображение в виде строки, полученное из соответствующей ячейки базы данных. Данное выражение, содержащееся в атрибуте src, указывает, что это изображение (image/jpeg), закодированное в base64. Обратите внимание: это не ссылка на изображение, это само изображение, вводимое сюда с помощью php-кода.

Теперь при открытии страницы, содержащей данный код, на ней в указанном месте будет выводится изображение.

 

 

 

 

Добавлять комментарии и ответы могут только пользователи, прошедшие регистрацию!
Зарегистрируйтесь и напишите своё мнение или ответ!