Добавление изображений в базу данных MySQL через PHP

Доброго времени суток, уважаемые читатели блога SoftMaker.kz. На этом сайте уже есть статьи о PHP и приведены
Примеры программирования в PHP. А сейчас мы поговорим, как добавлять изображения в базу MySQL через форму, используя PHP.


PHP добавление изображения в базу MySQL

Создание поля в MySQL базе для добавления изображения

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

Сокращение BLOB означает большой двоичный объект. Тип хранения данных BLOB обладает несколькими вариантами:

  • TINYBLOB — Может хранить до 255 байт
  • BLOB может хранить до 64 килобайт информации
  • MEDIUMBLOB — до 16 мегабайт
  • LONGBLOB до 4 гигабайт

Для хранения файла изображения в базе данных необходимо прочитать файл в переменную и создать запрос на добавление данных в таблицу.

Подготовка формы на странице для добавления изображения в базу данных MySQL

В моём случае задача была добавлять два изображения в базу через форму, используя PHP. У нас есть форма с двумя полями и кнопкой отправить:

form name=»form1″ method=»post» action=»add_image.php»
enctype=»multipart/form-data»

 

 

Каждое изображение не должно привышать 1Мб!

Напомню, что атрибут action указывает файл, который будет выполнять загрузку файлов изображения. Атрибут enctype указывает на способ кодирования содержимого формы и информацию о подгрузке файлов. Посмотрите, как правильно заполнять атрибут enctype чтобы, избежать ошибки при передаче значений через форму методом POST.

Примечание: поддержка загрузки нескольких файлов была введена в версии 3.0.10.

Написание кода PHP для сохранения изображения в базе данных MySQL

Так как мы отправляем два файла в атрибуте name после слова указываем «userfile[]» с квадратными скобками, этим мы даем понять, что отправляем несколько файлов с помощью массива, в котором находятся атрибуты файлов:

$_FILES[‘userfile’][‘name’]

Оригинальное имя файла на клиентской машине.

$_FILES[‘userfile’][‘type’]

mime-тип файла, если браузер предоставил эту информацию.
Пример: "image/gif".

$_FILES[‘userfile’][‘size’]

$_FILES[‘userfile’][‘tmp_name’]

Временное имя файла, под которым загруженный файл был сохранён на сервере.

Как получить значения каждого файла?

К примеру, предположим, что отправлены файлы с именами /home/test/1.jpg и /home/test/2.jpg.

В этом случае $_FILES[‘userfile’][‘name’][0]
будет содержать значение 1.jpg,
а $_FILES[‘userfile’][‘name’][1]
— значение 2.jpg

Аналогично, $_FILES[‘userfile’][‘size’][0] будет содержать значение размера файла 1.jpg, и так далее. Теперь рассмотрим код файла add_image.php, который был указан в атрибуте формы action.

<?php

$ErrorDescription = '';
function get_image($num){
  global $ErrorDescription;
  static $image_size=0;
  // Проверяем не пустали глобальная переменная $_FILES
  if(!empty($_FILES)){
	$image_size=$_FILES['userfile']['size'][$num];
	// Ограничение на размер файла, в моём случае 1Мб
	if($image_size>1024*1024||$image_size==0)
	{
		$ErrorDescription="Каждое изображение не должно привышать 1Мб! 
			Изображение в базу не может быть добавлено.";
			return '';
	}
	// Если файл пришел, то проверяем графический
	// ли он (из соображений безопасности)
	if(substr($_FILES['userfile']['type'][$num], 0, 5)=='image')
	{
		//Читаем содержимое файла
		$image=file_get_contents($_FILES['userfile']['tmp_name'][$num]);
		//Экранируем специальные символы в содержимом файла
		$image=mysql_escape_string($image);
		return $image;      
	}else{
		ErrorDescription="Вы загрузили не изображение,
			поэтому оно не может быть добавлено.";
			return '';
	}    
  }else{
	$ErrorDescription="Вы не загрузили изображение, поле пустое,
		поэтому файл в базу не может быть добавлен.";
		return ;
  }
	return $image;
}
?>

<?php

//...
// Используя ранее определенную функцию get_image присваиваем
// переменным содержимое файлов
$image_before=get_image(0);
if ($image_before == ''){
	unset($image_before);
}else{
	$image_after=get_image(1);
	if ($image_after == ''){
		unset($image_after);
	}
}
// ...
// Проверяем, установлены ли переменные
if (isset($title) && isset($image_after)&&isset($image_before)){
	/* Здесь пишем что можно заносить информацию в базу.
	В нашем случае в базе существует два поля типа
	MEDIUMBLOB:img_before и img_after */
	$result = mysql_query (
		"INSERT INTO imagess(title,img_before,img_after) 
		VALUES ('$title','$image_before','$image_after')");
	if ($result == 'true'){
		echo "Ваши изображения успешно добавлены!";
	}else{echo "Ваши изображения не добавлены!";}
}else{
	if ($ErrorDescription == ''){
		echo "Вы ввели не всю информацию, поэтому 
			изображения в базу не могут быть добавлены.";
	}else{echo $ErrorDescription;}
}

?>

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

Во второй статье давайте рассмотрим как извлечь сохранённый файл изображения из базы MySQL.

25 ответы
  1. Санёк говорит:

    Слушай скрипт норма но чёто неработает я создал два поля и кнопкой отправить назвал эти поля <input name="userfile[]" type="file" />
    он пишет Вы ввели не всю информацию, поэтому изображения в базу не могут быть добавлены.

  2. Softmaker говорит:

    isset($title) && isset($image_after)&& isset($image_before)
    эти переменные существуют?
    условия изменили?

  3. Санёк говорит:

    Условия не менял ничего всё запухнул в 1 файл то в форме убрал отправку action="add_image.php" сделал на этотже файл у меня не двумя файлами) корочи это не так важно и немогло повлиять на исход функции, так переменые — вот что приходит методом гет (/addimage.php?userfile%5B%5D=1f6f9ab0ced0331a274f20d96be0a2a8.jpg&userfile%5B%5D=1f6f9ab0ced0331a274f20d96be0a2a8.jpg)

  4. Санёк говорит:

    Вообщем перепроверь код, он мне понравился но чёто недоконца работает, и если возможно сделай кнопки с отправкой файла у тебя в начале поста (пропиши их)ато некоторым может и непонятно)

  5. Softmaker говорит:

    "у меня не двумя файлами" — если один файл, то условие надо изменить, убрать или isset($image_after) или isset($image_before), какой ты не используешь? код работает я его использовал, когда писал сайт http://www.paintcar.comyr.com/view_lesson.php?id=22.
    Если условия остаются, а ты не передаешь через форму значения, то выводится сообщение: "Вы ввели не всю информацию, поэтому изображения в базу не могут быть добавлены."

  6. Softmaker говорит:

    Пиши не userfile[], userfile — без скобок, т. к. отправляешь один файл, а не массив.

  7. Санёк говорит:

    Смотри мой код

    <?

    $ErrorDescription = »;

    function get_image($num)
    {
    global $ErrorDescription;
    static $image_size=0;

    // Проверяем не пустали глобальная переменная $_FILES

    if(!empty($_FILES))
    {

    $image_size=$_FILES[‘userfile’][‘size’][$num];
    // Ограничение на размер файла, в моём случае 1Мб
    if($image_size>1024*1024||$image_size==0)
    {
    $ErrorDescription="
    Каждое изображение не должно привышать 1Мб! Изображение в базу не может быть добавлено.";
    return »;
    }

    if(substr($_FILES[‘userfile’][‘type’][$num], 0, 5)==’image’)
    {
    // Читаем содержимое файла
    $image=file_get_contents($_FILES[‘userfile’][‘tmp_name’][$num]);
    // Экранируем специальные символы в содержимом файла
    $image=mysql_escape_string($image);
    return $image;
    }

    else
    {
    $ErrorDescription="
    Вы загрузили не изображение, поэтому оно не может быть добавлено.
    ";
    return »;
    }
    }

    else
    {
    $ErrorDescription="Вы не загрузили изображение, поле пустое, поэтому файл в базу не может быть добавлен.";return ;
    }
    return $image;
    }

    // Используя ранее определенную функцию get_image присваиваем //переменным содержимое файлов
    $image_before=get_image(0);
    if ($image_before == »)
    {
    unset($image_before);
    }
    else
    {
    $image_after=get_image(1); if ($image_after == »)
    {
    unset($image_after);
    }
    }

    // Проверяем, установлены ли переменные
    if (isset($title) && isset($image_after)&& isset($image_before))
    {
    include "baza-bd/config.php";
    /* Здесь пишем что можно заносить информацию в базу.
    В нашем сдучае в базе существует два поля типа MEDIUMBLOB:img_before и img_after */
    $result = mysql_query ("INSERT INTO imagess (title,img_before,img_after) VALUES (‘$title’,’$image_before’,’$image_after’)",$db);
    if ($result == ‘true’)
    {
    echo "Ваши изображения успешно добавлены!";
    }

    else
    {
    echo "Ваши изображения не добавлены!";
    }
    }

    else
    {
    if ($ErrorDescription == »)
    {
    echo "Вы ввели не всю информацию, поэтому изображения в базу не могут быть добавлены.";
    }

    else
    {
    echo $ErrorDescription;
    }

    }

    ?>

  8. Санёк говорит:

    Сорьки думал у тебя код выстроится…
    вот сама форма, мож я чё в форме напутал,
    <form name="form1" method="post" action="" enctype="multipart/form-data">

    <input name="userfile" type="file">

    <input name="userfile" type="file">

    <input name="poslat1" type="submit" value="отправить">

    </form>

  9. Softmaker говорит:

    Один файл передаешь? Зачем, тогда проверяешь два ? Какую переменную используешь? $image_after или $image_before?

  10. Softmaker говорит:

    Если один файл, тогда убери в функции get_image($num) переменную [$num]. Например, не $image_size=$_FILES[‘userfile’][‘size’][$num];
    А $image_size=$_FILES[‘userfile’][‘size’];
    Если один файл передаешь, userfile — то одно значение, а если userfile[], то массив.

  11. Санёк говорит:

    Да а почему я 1 файл передаю??? у меня помоему 2 поля с <input name="userfile" type="file">
    и кнопкой отправить

  12. Softmaker говорит:

    Если хочешь передавать несколько файлов, используется один input, типа type="file" с именем name="userfile[]" в имени скобки "[]" показывают, что передаються несколько файлов, посмотри статью http://softmaker.kz/articles.php?cat=5&id=41, может поможет понять лучше этот механизм

  13. foreach говорит:

    Никогда, никогда не храните изображения в базе данных. Хорошо если у вас их 10. А если 100000000? Тогда ваша база будет весть много терабайт. И соответственно так и будет работать ваш сайт. Кроме того это не безопасно. Храните в базе ссылки, а сами изображения в директории!

  14. Константин говорит:

    По поводу хранения изображений в БД — вопрос спорный — у преподов в институте мнения разделились — с одной стороны разрастается БД, с другой при перемещении /переименовании img будут глюки в базе, имхо зависит от предполагаемого размера БД и размера хранимых изображений

  15. Softmaker говорит:

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

  16. Кьонстантин говорит:

    Softmaker,согласен, а Вы не подскажете, где можно посмотреть, как получить и сохранить на сервере аудиофайл с произношением слова от гугл спич,\r\nписал программу на C # программа тренажер для изучения англ языка — пользователь загружал в нее текстовый или srt файл прога парсила слова, и по клику пользователя выводила переводы слова, слова добавлялись в урок и потом прокручивались для изучения.\r\nПроблема была в том, что аудиофайл(mp3) который приходил от гугла был в какой-то кодировке которую не удавалось прочитать ни программно (медиаклассами С#)ни с помощью aimp или winamp пришлось делать костыль — по клику в программеоткрывать браузер и воспроизводить через него.\r\nВот переделываю эту программу на php и терзают меня смутные сомнения — опять начнутся бока с аудиофайлом.\r\nБуду очень и очень признателен, если направите в нужную сторону.

  17. Softmaker говорит:

    Может есть какой-нибудь API от гугл для этого? Там посмотреть обработку их файлов?

  18. Константин говорит:

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

  19. Полина говорит:

    Отличный скрипт! Спасибо! Очень помог!

    • softmaker говорит:

      Пожалуйста, рад, что помог вам! Всего доброго!

  20. plastall.com.ua говорит:

    Файловая система заточена под работу с файлами, поэтому она гораздо быстрее обработает то же изображение, чем MySQL будет его извлекать из таблицы, а Вы потом ещё будете создавать изображение из байтов.

Комментарии закрыты.