Добавление изображений в базу данных MySQL через PHP
Доброго времени суток, уважаемые читатели блога SoftMaker.kz. На этом сайте уже есть статьи о PHP и приведены
Примеры программирования в PHP. А сейчас мы поговорим, как добавлять изображения в базу MySQL через форму, используя PHP.
- Создание поля в MySQL базе для добавления изображения
- Подготовка формы на странице для добавления изображения в базу данных MySQL
- Написание кода 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»
Напомню, что атрибут 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.
Че то не работает?
А что именно?
Слушай скрипт норма но чёто неработает я создал два поля и кнопкой отправить назвал эти поля <input name="userfile[]" type="file" />
он пишет Вы ввели не всю информацию, поэтому изображения в базу не могут быть добавлены.
Код можно посмотреть?
isset($title) && isset($image_after)&& isset($image_before)
эти переменные существуют?
условия изменили?
Условия не менял ничего всё запухнул в 1 файл то в форме убрал отправку action="add_image.php" сделал на этотже файл у меня не двумя файлами) корочи это не так важно и немогло повлиять на исход функции, так переменые — вот что приходит методом гет (/addimage.php?userfile%5B%5D=1f6f9ab0ced0331a274f20d96be0a2a8.jpg&userfile%5B%5D=1f6f9ab0ced0331a274f20d96be0a2a8.jpg)
Вообщем перепроверь код, он мне понравился но чёто недоконца работает, и если возможно сделай кнопки с отправкой файла у тебя в начале поста (пропиши их)ато некоторым может и непонятно)
Если есть аська стукни… 240016019
"у меня не двумя файлами" — если один файл, то условие надо изменить, убрать или isset($image_after) или isset($image_before), какой ты не используешь? код работает я его использовал, когда писал сайт http://www.paintcar.comyr.com/view_lesson.php?id=22.
Если условия остаются, а ты не передаешь через форму значения, то выводится сообщение: "Вы ввели не всю информацию, поэтому изображения в базу не могут быть добавлены."
Пиши не userfile[], userfile — без скобок, т. к. отправляешь один файл, а не массив.
Смотри мой код
<?
$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;
}
}
?>
Сорьки думал у тебя код выстроится…
вот сама форма, мож я чё в форме напутал,
<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>
Один файл передаешь? Зачем, тогда проверяешь два ? Какую переменную используешь? $image_after или $image_before?
Если один файл, тогда убери в функции get_image($num) переменную [$num]. Например, не $image_size=$_FILES[‘userfile’][‘size’][$num];
А $image_size=$_FILES[‘userfile’][‘size’];
Если один файл передаешь, userfile — то одно значение, а если userfile[], то массив.
Да а почему я 1 файл передаю??? у меня помоему 2 поля с <input name="userfile" type="file">
и кнопкой отправить
Если хочешь передавать несколько файлов, используется один input, типа type="file" с именем name="userfile[]" в имени скобки "[]" показывают, что передаються несколько файлов, посмотри статью http://softmaker.kz/articles.php?cat=5&id=41, может поможет понять лучше этот механизм
Никогда, никогда не храните изображения в базе данных. Хорошо если у вас их 10. А если 100000000? Тогда ваша база будет весть много терабайт. И соответственно так и будет работать ваш сайт. Кроме того это не безопасно. Храните в базе ссылки, а сами изображения в директории!
По поводу хранения изображений в БД — вопрос спорный — у преподов в институте мнения разделились — с одной стороны разрастается БД, с другой при перемещении /переименовании img будут глюки в базе, имхо зависит от предполагаемого размера БД и размера хранимых изображений
Константин, это просто пример, каждый сам решает, что ему делать. Хранить изображения в БД или не хранить? Вот в чем вопрос.
Softmaker,согласен, а Вы не подскажете, где можно посмотреть, как получить и сохранить на сервере аудиофайл с произношением слова от гугл спич,\r\nписал программу на C # программа тренажер для изучения англ языка — пользователь загружал в нее текстовый или srt файл прога парсила слова, и по клику пользователя выводила переводы слова, слова добавлялись в урок и потом прокручивались для изучения.\r\nПроблема была в том, что аудиофайл(mp3) который приходил от гугла был в какой-то кодировке которую не удавалось прочитать ни программно (медиаклассами С#)ни с помощью aimp или winamp пришлось делать костыль — по клику в программеоткрывать браузер и воспроизводить через него.\r\nВот переделываю эту программу на php и терзают меня смутные сомнения — опять начнутся бока с аудиофайлом.\r\nБуду очень и очень признателен, если направите в нужную сторону.
Может есть какой-нибудь API от гугл для этого? Там посмотреть обработку их файлов?
Смотрел, вроде бы гугл перестал поддерживать свой апи или он стал платным — точно не помню, спасибо за ответ и помощь, буду искать, если найду решение могу отписаться.
Отличный скрипт! Спасибо! Очень помог!
Пожалуйста, рад, что помог вам! Всего доброго!
Файловая система заточена под работу с файлами, поэтому она гораздо быстрее обработает то же изображение, чем MySQL будет его извлекать из таблицы, а Вы потом ещё будете создавать изображение из байтов.