Содержание
- 1 Шаг 1. Создайте HTML-форму
- 2 Шаг 2. Подключитесь к базе данных и сохраните изображение
- 3 Шаг 3. Отображение сохраненных изображений из базы данных
- 4 Шаг 1. Создайте HTML-форму
- 5 Шаг 2. Сохранение изображения на сервере
- 6 Шаг 3. Вывод изображений
- 7 Хранение изображений в базе данных MySQL
- 7.1 Комментариев: 59
- 7.1.1 admin:
- 7.1.2 Владимир Лапшин:
- 7.1.3 admin:
- 7.1.4 Анатолий:
- 7.1.5 admin:
- 7.1.6 Анатолий:
- 7.1.7 admin:
- 7.1.8 Анатолий CMX:
- 7.1.9 victor:
- 7.1.10 admin:
- 7.1.11 victor:
- 7.1.12 Дмитрий:
- 7.1.13 Сергей:
- 7.1.14 admin:
- 7.1.15 Mujeek:
- 7.1.16 Mujeek:
- 7.1.17 Mujeek:
- 7.1.18 admin:
- 7.1.19 Ренат:
- 7.1.20 Mujeek:
- 7.1.21 hannibal:
- 7.1.22 Максим:
- 7.1.23 admin:
- 7.1.24 admin:
- 7.1.25 Евгений:
- 7.1.26 Sancho:
- 7.1.27 Sancho:
- 7.1.28 admin:
- 7.1.29 Ольга:
- 7.1.30 admin:
- 7.1.31 Ольга:
- 7.1.32 admin:
- 7.1 Комментариев: 59
Есть два способа загрузки изображений: в базу данных или на сервер. В этой статье мы рассмотрим оба метода. Предполагается, что у вас есть базовые знания HTML, PHP и MySQL.
Для загрузки изображения в базу данных требуется выполнить три шага:
1. Создайте HTML-форму для загрузки.
2. Подключитесь к базе данных и сохраните изображения.
3. Отобразите изображения.
Шаг 1. Создайте HTML-форму
Создадим HTML-форму с методом post и сохраним ее в файле с именем upload.html .
Мы отправляем данные из этой HTML-формы в файл getdata.php , с помощью которого изображение будет сохранено в базе данных.
Шаг 2. Подключитесь к базе данных и сохраните изображение
Сначала нужно подключиться к базе данных. В примере мы используем БД «demo».
Чтобы сохранить изображение в базе, нужно использовать для столбца в таблице тип данных blob . MySQL использует BLOB для хранения двоичных данных. Вы можете использовать BLOB TINYBLOB, BLOB, MEDIUMBLOB или LONGBLOB в зависимости от размера загружаемого рисунка.
Шаг 3. Отображение сохраненных изображений из базы данных
Чтобы вывести изображения, нужно создать два файла. Это файл fetch_image.php.
Теперь мы хотим отобразить изображение — это делается с помощью файла display_image.php .
Для загрузки изображения на сервер также потребуется три шага:
1. Создайте HTML-форму для загрузки изображения.
2. Сохраните путь к базе данных и изображение на сервере.
3. Выведите изображение.
Шаг 1. Создайте HTML-форму
Вы можете использовать HTML-форму из предыдущего примера.
Шаг 2. Сохранение изображения на сервере
На этом этапе мы получаем изображение и сохраняем его в каталоге, а затем сохраняем путь к изображению и имя файла в базе данных. Это файл store_image.php.
Шаг 3. Вывод изображений
Чтобы вывести изображение, нужно получить из базы данных имя файла и путь к нему. Это файл fetch_image.php.
Таким образом можно загрузить изображение в базу данных с помощью HTML, PHP и MySQL.
Данная публикация представляет собой перевод статьи « Upload Image to Database and Server using HTML, PHP and MySQL » , подготовленной дружной командой проекта Интернет-технологии.ру
PHP, MySQL, JavaScript, AJAX, HTML и CSS
Хранение изображений в базе данных MySQL
Для хранения изображений в базе данных MySQL необходимо определить одно из полей таблицы как производное от типа BLOB. Сокращение BLOB означает большой двоичный объект. Тип хранения данных BLOB обладает несколькими вариантами:
- TINYBLOB – может хранить до 255 байт
- BLOB – может хранить до 64 килобайт информации
- MEDIUMBLOB – до 16 мегабайт
- LONGBLOB – до 4 гигабайт
Соответсвенно, для хранения изображений нам надо создать таблицу images с двумя полями:
- id – уникальный ID изображения
- content – поле для хранения изображения
Для сохранения файла изображения в базе данных необходимо прочитать файл в переменную и создать запрос на добавление данных в таблицу. Допустим у нас есть форма для загрузки файла изображения на сервер:
Обработчик формы – файл putimage.php:
Извлечь сохраненный файл изображения можно следующим образом (файл image.php):
Чтобы вывести изображение в HTML-документе, делаем так:
И последнее: графические файлы иногда имеют довольно большой размер, убедитесь, что настройки сервера позволяют работать с таким объемом данных. В файле php.ini это директивы post_max_size – определяет максимальный объем данных передаваемых методом POST, и upload_max_filesize – определяет максимальный размер загружаемого файла. Так же проверьте, позволяют ли настройки MySQL обрабатывать запросы с большим объемом данных (директива max_allowed_packet файла my.ini).
Комментариев: 59
еще бы примеры, когда хранить картинки в базе лучше чем просто на диске
admin:
art, хранить графические файлы в базе данных – не самое удачное решение. Ведь это создает дополнительную нагрузку на сервер БД.
Когда мы сохраняем в базе данных каталог продукции, заказы в Интернет-магазине – то это вполне оправдано. Потому как альтернативный вариант – сохранять всю информацию в файлах. И работать с файлами напрямую. Но базы данных для того и созданы, чтобы избавить нас от этой рутины. Ведь в конечном итоге, все данные все равно сохраняются в файлах, хотя мы и говорим, что “данные хранятся в БД”. БД – это некий уровень абстракции, который здорово облегчает жизнь.
Почему тогда хранят файлы в базе данных? Дело в том, что на некоторых хостингах на объем дискового пространства есть ограничения, в то время как на размер БД – нет. Подчеркиваю – на некоторых. В этом случае, чтобы не выйти за пределы дисковой квоты прибегают к такой хитрости – хранят файлы в БД. В противном случае смысла в этом нет.
Владимир Лапшин:
“SELECT *” в реально работающем приложении не самая хорошая идея. Лучше все-таки перечислять нужные поля. Точно помогает, когда в таблицу приходится добавить еще какое-то поле.
admin:
“SELECT *” в реально работающем приложении не самая хорошая идея.
Согласен, сам читал об этом, но частенько забываю. Здесь это тем более актуально – нам нужно выбрать всего одно поле. Исправил.
Анатолий:
Здравствуйте. Помогите начинающему. Загрузка картинки в базу идет нормально (вроде бы), т.е. объем загруженного файла (8кб) соответствует объему картинки, но плучить изображение обратно я не могу. В приведенном вами файле image.php – $_GET – не существует. Я малость его изменил – убрал лишние пока проверки – в результате, файл выводится, но не в виде картинки, а в виде текста-абракадабры.
Привожу свой вар. подскажите где ошибка, если знаете.
// Отсылаем браузеру заголовок, сообщающий о том,
//что сейчас будет передаваться файл изображения
header ( "Content-type: image/*" ) ;
include_once ‘conf4b.php’ ; //подключаем базу
//Вывод изображения из БАЗЫ, загруженного из формы
$query = "SELECT content FROM image " ;
// Выполняем запрос и получаем файл
$res = mysql_query ( $query ) ;
$image = mysql_fetch_array ( $res ) ;
echo $image [ ‘content’ ] ;
//выводится пустой квадратик
mysql_close ( $connect ) or die ( "not razriva" ) ;
print "соединение разорвано" ;
?>
admin:
Анатолий, вы посылаете заголовок, сообщающий браузеру, что дальше идет изображение. Поэтому нельзя выводить в браузер ничего, кроме содержимого картинки. Т.е. факт наличия в скрипте оператора
уже является ошибкой. Браузер считает строку “соединение разорвано” частью изображения.
Анатолий:
Я полагал, что перед header нельзя делать какой-либо вывод.
Впрочем, я убрал принт, оставил только одно echo – результат тот же.
admin:
Перед заголовками, разумеется, не должно быть вывода. Сервер и браузер общаются между собой при помощи заголовков. В данном случае ты отправляешь браузеру заголовок “Content-type: image/*”, сообщающий браузеру, что ВСЕ ДАЛЕЕ будет картинка. Но вместе с картинкой отправляешь еще и текст. По поводу того, почему не работает – причин может быть воз и маленькая тележка:
1. скрипт для коннекта к БД содержит после закрывающего тега ?> какой-нибудь вывод (например, пробел или перевод строки)
2. пробел или пустая строка перед открывающим тегом 8 Октябрь 2008, 23:08
Анатолий CMX:
Спасибо! То что нужно! Все работает без правок и добавлений. Как семпл очень полезно и информативно!
От себя могу добавить, что хранение изображений в базе данных актуально например когда:
1) используются каталоги изображений для шаблонов (например наборы иконок)
2) когда есть много мелких изображений, файлы которых “весят” очень мало, но самих файлов очень много. В базе будет занято ровно столько места сколько требуется, а не сектора диска под нефактический объем файла.
НО:
Если вы собрались делать фото галерею или каталог “крупных” изображений, то целесообразнее организовать каталог в виде папок и подпапок на диске, а уже ссылки на файлы можно хранить в базе! Т.к. при достаточно большом объеме файлов и их количестве, если хранить данные в базе, возрастет нагрузка на ресурсы сервера при обращении и получениии данных из базы.
не знаю толково или нет, но думаю что прокомментировал в тему!
Мне понравилось про () , люблю изощренные решения. но всё таки мне не понятно почему тот же пхп не сделал стандартную функцию для чтения бинарных изображений из БД. явно напрашивается такая штука.
victor:
Хранить изображения в базе очень удобно. Насчёт загрузки сервера – это миф. Использую MSSQL 2005 и RAID 5, база около 20Г.
admin:
victor, а в чем удобство-то? Какое реальное преимущество мы получаем, если изображение у нас в таблице БД, а не просто в директории?
victor:
В администрировании, бекап, безопасность, механизм построения галереи простой. То есть я имею введу необходимые действия удаления, изменение, добавления галерей и фото. Всё это элементарно организуется посредствам самой ДБ (cascade) и требует минимального кода. В случае хранения фото “на диске” алгоритм сильно усложняется, нужно выполнять множество проверок при выполнении операций с диском… MSSQL сильно отличается от MySQL , а именно структура хранения данных, не рискнул бы хранить в ней большое количество фото.
Дмитрий:
Убогое какое-то описание, а где в скрипте соединение с базой данных, выбор таблицы. Уж если описываете, так сделайте чтобы даже военным было понятно
Сергей:
при переходе с MSSQL на MySQL столкнулся с проблемой, select count(*) from image; (посчитать количество картинок в базе) на MySQL выполняется 25 сек, на MSSQL MySQL меньше секунды. в таблице 50000 картинок, 300MB.
это нормально для mysql? или я что-то не так делаю?
admin:
Сергей, здесь явно что-то не так. Не может быть, чтобы разница во времени выполнения была такой большой. Попробуйте задать свой вопрос на форумах
SQL.RU
SQLINFO.RU
Mujeek:
Преимущества хранения изображений в базе – на лицо… когда есть необходимость каскадного удаления данных, а изображения находится, например, на 3 уровне подчинённости удаляемой записи..
Mujeek:
вдобавок не нужны проверки существования в каталоге одноименного файла…
Mujeek:
Будут ли кэшироваться на клиенте изображения, полученные из базы данных,или при каждом открытии страницы все изображения закачиваются заново?
admin:
Mujeek, вообще, дело обстоит так
* Страницы передаваемые по POST никогда не сохраняются в кэш.
* Страницы запрашиваемые по GET и содержащие параметры (в URL присутствует ‘?’) не сохраняются в кэш, если не указано обратное.
Наш вызов скрипта картинки выглядит так
http://server.com/image.php? > а значит по правилам изображение не будет сохраняться в кэш (присутствуют параметры), но через заголовок можно управлять этим. Подробности здесь:
PHP и Web. Кэширование
Ренат:
Здравствуйте, хочу спросить, а средствами PHP можно вывести на экран вместе с картинкой ещё, к примеру, оформление сайта? Ну не только картинку на экран? Или это уже к JavaScript’y?
Mujeek:
И как получить увеличенную картинку в отдельном окне при клике на изображении?
hannibal:
Очень нужно. Подскажите как вывести несколько изображений из базы.
Максим:
Сделал, подобие примера. Точнее повторил все точно точно также но вот вывода картинки я не вижу.
Загружаеться но вывода нет.
В чем может быть проблема? картика 64кб, поле(блоб).
qip 439_810-757 Мучаюсь 2 день, прошу помощи.
admin:
И как получить увеличенную картинку в отдельном окне при клике на изображении?
onClick=”popupWin = window.open(this.href, ”, ‘location,w >
А если красиво – использовать готовое решение:
Плагин FancyBox для библиотеки jQuery
admin:
Максим, давайте обсудим это на форуме. Выкладывайте свой скрипт, посмотрим, в чем там проблема.
Евгений:
> при переходе с MSSQL на MySQL столкнулся с проблемой,
> select count(*) from image; (посчитать количество
> картинок в базе) на MySQL выполняется 25 сек, на
> MSSQL MySQL меньше секунды. в таблице 50000 картинок, 300MB.
> это нормально для mysql? или я что-то не так делаю?
Не так делаете. Зачем запрашивать все поля *?
Проще и быстрее будет SELECT COUNT(`id`) FROM `image`;
Sancho:
Sancho:
не пойму почему не передает полный текст
admin:
Sancho, а Вы о чем вообще говорите?
Ольга:
Скажите, что делать с хедером, если изображение мне нужно вывести в середине страницы и, естественно, заголовок уже выведен.
При инклюде image.php, вылезает ошибка – Warning: Cannot modify header information – headers already sent by (output started at Z:homelocalhostwwwxyxaindex.php:17) in Z:homelocalhostwwwxyxaimage.php on line 13
Как мне всё же вывести изображение из БД в index.php?
(И, мало ли у кого есть готовый пример для ресайза изображения ДО добавления его в БД – буду очень признательна. Хотелось бы из одной загружаемой человеком фотографии сделать превью и фото, к примеру 600х400 и поместить их в БД, причем учитывая, что просто уменьшение может оказаться не пропорциональным, если, к примеру, фото было 1200х1000)Спасибо.
admin:
если изображение мне нужно вывести в середине страницы и, естественно, заголовок уже выведен. При инклюде image.php, вылезает ошибка – Warning: Cannot modify header information
По-моему, в заметке четко написано: чтобы вывести изображение в HTML-документе, делаем так
Включать изображение на страницу с помощью include?! Даже не комментирую…
у кого есть готовый пример для ресайза изображения ДО добавления его в БД
Масштабирование изображений
Ольга:
Включать изображение на страницу с помощью include?! Даже не комментирую…
Спасибо за быстрый ответ, но Вы не поняли, я не изображение же вставляю include, а файл image.php, а в самом html коде, конечно же.
Мне не понятна вот эта часть Вашего кода:
// Отсылаем браузеру заголовок, сообщающий о том, что сейчас будет передаваться файл изображения
header(”Content-type: image/*”);
Это же получается второй header и выдается ошибка ( Если не сложно, пожалуйста, объясните? Я все сделала так, как Вы указали в коде, затем весь пхп в отдельном файле image.php я добавила в индексную страницу в то место, где планируется вывод картинки. (Пробовала и не отдельным файлом image.php делать, а втавлять код сразу в страницу, где оно выводится), но результат один и тот же:
Cannot modify header information – headers already sent by (output started at …
Заранее спасибо.
admin:
но Вы не поняли, я не изображение же вставляю include, а файл image.php, а в самом html коде, конечно же
Я прекрасно понял, что с помощью include вставляется файл image.php. И именно поэтому сказал “Даже не комментирую…”. Еще раз для особо сообразительных – файл index.html (или index.php), где надо вывести изображение:
// здесь какой-то код
?>
.
// здесь еще какой-то код
?>
Изображение:
1) Какой тип поля использовать и вообще как харнится там картинка, в виде набора байтов?
2) Вопрос, вытекающий из предыдущего, как сделать запрос на вставку и указать это jpg, png, gif и т.д.?