Multipart-формы, тег выбора файла
⇐ ПредыдущаяСтр 10 из 10 Слово «закачать» обозначает загрузку файла клиента на сервер, и термин «скачать» – обратный процесс (с сервера – клиенту). В большинстве случаев данные из формы в браузере, передающиеся методом GET или POST, приходят в формате: поле1=значение1&поле2=значение2&... При этом все символы, отличные от «английских» букв и цифр (и еще некоторых) URL-кодируются: заменяются на %XX, где XX – шестнадцатеричный код символа. Это замедляет закачку больших файлов. Multipart-формы используются для решения этой проблемы. Нужно в соответствующем тэге <form> задать параметр: enctype=multipart/form-data После этого данные, полученные от формы, будут разбиты на несколько блоков информации (по одному на каждый элемент формы). Каждый такой блок очень похож на обычную посылку «заголовки-данные» протокола HTTP: -----------------Идентификатор_начала\n Content-Disposition: form-data; name="имя" [;другие параметры]\n \n значение\n Браузер автоматически формирует строку Идентификатор_начала из расчета, чтобы она не встречалась ни в одном из передаваемых файлов (и ни в одном из других полей формы). Это означает, что сегодня идентификатор будет одним, а завтра – другим. Для того, чтобы в форме появился элемент управления загрузкой файла – текстовое поле с кнопкой Browse справа, нужно в форму добавить следующий тег: <input type=file name=имя_элемента [size=размер_поля]> Сценарию вместе с содержимым файла передается и некоторая другая информация, а именно: размер файла; имя файла в системе клиента; тип файла. 15.2 Поддержка закачки в PHP Простые имена полей закачки. Интерпретатору не имеет значения, в каком формате приходят данные из формы. Он умеет их обрабатывать и «рассовывать» по переменным в любом формате. Однако данные одного специального поля формы – поля закачки – он интерпретирует особым образом. Пусть есть multipart-форма, а в ней – поле закачки файла:
<form action="script.php" method=POST enctype=multipart/form-data> <input type=file name="MyFile"> <input type=submit> </form> После выбора в этом поле нужного файла и отправки формы (и загрузки на сервер того файла, который был указан) PHP определит, что нужно принять файл, и сохранит его во временном каталоге на сервере. Кроме того, в программе создадутся несколько переменных: $MyFile – имя временного файла на машине сервера, который содержит данные, переданные пользователем. Теперь этот файл можно удалять, копировать, переименовывать. $MyFile_name – исходное имя файла, которое он имел до отправки на сервер. $MyFile_size – размер закаченного файла в байтах. $MyFile_type – тип загруженного файла, если браузер смог его определить. К примеру, image/gif, text/html и т. д. Префикс у всех созданных переменных один и тот же – MyFile_. Этот префикс состоит из имени элемента закачки в форме, к которому присоединен знак _. Теперь можно, например, скопировать полученный файл при помощи Copy($MyFile,"uploaded.dat"). Если процесс окончится неуспешно, можно определить это по отсутствию файла, имя которого задано в $MyFile, или же по отсутствию самой этой переменной в программе. Пример сценария, представляющий собой простейший фотоальбом с возможностью добавления в него новых фотографий. <? $ImgDir="img"; // Каталог для хранения изображений @mkdir($ImgDir,666); // Создаем, если его еще нет // Проверяем, нажата ли кнопка добавления фотографии if(@$doUpload) { // Проверяем, принят ли файл if(file_exists($File)) { // Все в порядке – добавляем файл в каталог с фотографиями // Используем то же имя, что и в системе пользователя Copy($File,"$ImgDir/".basename($File_name)); } } // Теперь считываем в массив фотоальбом $d=opendir($ImgDir); // открываем каталог $Photos=array(); // изначально альбом пуст
// Перебираем все файлы while(($e=readdir($d))!==false) { // Это изображение GIF, JPG или PNG? if(!ereg("^(.*)\\.(gif|jpg|png)$",$e,$P)) continue; // Если нет, переходим к следующему файлу, // иначе обрабатываем этот $path="$ImgDir/$e"; // адрес $sz=GetImageSize($path); // размер $tm=filemtime($path); // время добавления // Вставляем изображение в массив $Photos $Photos[$tm] = array( 'time' => filemtime($path), // время добавления 'name' => $e, // имя файла 'url' => $path, // его URI 'w' => $sz[0], // ширина картинки 'h' => $sz[1], // ее высота 'wh' => $sz[3] // "width=xxx height=yyy" ); } // Ключи массива $Photos – время в секундах, когда была добавлена // та или иная фотография. Сортируем массив: наиболее «свежие» // фотографии располагаем ближе к его началу. krsort($Photos); // Данные для вывода готовы. ?> <body> <form action=photo.php method=POST enctype=multipart/form-data> <input type=file name=File><br> <input type=submit name=doUpload value="Закачать новую фотографию"> </form> <?foreach($Photos as $n=>$Img) {?> <img src=<?=$Img['url']?> <?=$Img['wh']?> alt="Добавлена <?=date("d.m.Y H:i:s",$Img['time'])?>"> <?}?> </body> Сложные имена полей. Элементы формы могут иметь имена, выглядящие, как элементы массива: A[10], B[1][text] и т. д. Рассмотрим, какие переменные создаст PHP при ее отправке на сервер при использовании сложных имен полей для отправки файла: <form action="script.php" method=POST enctype=multipart/form-data> <h3>Выберите тип файлов в вашей системе:</h3> Текстовый файл: <input type=file name="File[text]"><br> Бинарный файл: <input type=file name="File[bin]"><br> Картинка: <input type=file name="File[pic]"><br> <input type=submit name=Go value="Отправить файлы"> </form> После того как программа script.php примет данные из формы, PHP создаст для нее следующие переменные: ассоциативный массив $File, ключи которого – text, bin и pic, а соответствующие значения – имена временных файлов на сервере, созданных PHP при загрузке; массив $File_name с теми же ключами и значениями – именами файлов в системе пользователя; массив $File_type с теми же ключами и значениями – типами соответствующих файлов; массив $File_size со значениями – размерами этих файлов. Информация об индексах в именах полей формы попала в ключи соответствующих массивов и сохранилась в них. Описанный механизм работает замечательно, лишь когда задействуем элементы одномерных массивов в качестве имен полей формы. В случае же многомерных массивов возникают проблемы. Пример:
<form action="script.php" method=POST enctype=multipart/form-data> <input type=file name="File[a][b]"> <input type=submit> </form> При приеме данных такой формы PHP «запутается» и, хотя и создаст массив $File, но не поместит в него никаких полезных данных. В элемент с ключом a вместо имени файла попадает какое-то комплексное число. Однако PHP, помимо установки вышеперечисленных переменных, создает также глобальный массив с именем $HTTP_POST_FILES. В этом массиве содержатся верные данные, какое бы имя не имело поле закачки в форме. Массив $HTTP_POST_FILES создается не всегда, а только в том случае, если в настройках PHP задействован параметр track_vars.
ЛИТЕРАТУРА
1 PHP и MySQL. Подсказки. Советы. Приемы работы / М. Белянин. – М.: НТ Пресс, 2007. 2 Афонин, С. Программирование на языке PHP / С. Афонин. – М.: НТ Пресс, 2007. 3 Веллинг, Л. Разработка Web-приложений с помощью PHP и MySQL / Л. Веллинг, Л. Томсон. – М.: Вильямс, 2005. 4 Гилмор, В. PHP 4. Учебный курс / В. Гилмор. – СПб.: Питер, 2001. 5 Григин, И. PHP 4. Специальный справочник / И. Григин. – СПб.: Питер, 2002. 6 Дунаев, В. Самоучитель PHP / В. Дунаев. – СПб.: Питер, 2006. 7 Зандстра, М. Освой самостоятельно PHP4 за 24 часа / Мэт Зандстра. – М.: Вильямс, 2001. 8 Колисниченко, Д. Профессиональное программирование на PHP / Д. Колисниченко. – СПб.: БХВ-Петербург, 2007. 9 Косентино, Кр. PHP: Web-профессионалам / Кр. Косентино. – Киев: BHV-Киев, 2001. 10 Костарев, А. PHP в Web-дизайне / А Костарев. – СПб.: BHV-СПб, 2002. 11 Котеров, Дм. Самоучитель PHP4 / Дм. Котеров. – СПб.: BHV-СПб, 2001. 12 Кузнецов, М. Головоломки на PHP для хакера / М. Кузнецов, И. Симдянов. – СПб.: БХВ-Петербург, 2008 13 Кузнецов, С. PHP 4.0. Руководство пользователя / С. Кузнецов. – М.: Майор, 2001. 14 Куссуль, Н. Использование PHP. Самоучитель / Н. Куссуль, А. Шелестов. – М.: Диалектика, 2005. 15 Кухпрчик, А. PHP: обучение на примерах / А. Кухарчик. – М.: Новое знание, 2004. 16 Мазуркевич, А. PHP. Настольная книга программиста / А. Мазуркевич, Д. Еловой. – М.: Новое знание, 2006. 17 Мелони, Дж. PHP 4 в действии / Дж Мелони. – М.: Лучшие книги, 2002. 18 Ньюман, К. Освой самостоятельно PHP. 10 минут на урок / К. Ньюман. – М.: Вильямс, 2005.
19 Орлов, А.А. PHP. Полезные приемы / А.А. Орлов. – М.: Горячая Линия – Телеком, 2003. 20 Пол, Х. PHP. Справочник / Х. Пол. – М.: Кудиц-Образ, 2006. 21 Профессиональное PHP программирование / Джезус Кастаньетто [и др.]. – М.: Символ-Плюс, 2001. 22 Профессиональное PHP программирование / Крис Сколло [и др.]. – М.: Символ-Плюс, 2003. 23 Ратшиллер, Т. PHP4: разработка Web-приложений. Библиотека программиста / Т. Ратшиллер, Т. Геркен. – СПб.: Питер, 2003. 24 Савельева, Н. Основы программирования на РНР / Н. Савельева. – М.: ИНТУИТ.РУ, 2005. 25 Сидмянов, И.В. Головоломки на PHP для хакера / Симдянов И.В., Кузнецов М.В. – М.: BHV, 2006. 26 Скляр, Д. PHP. Рецепты программирования / Д. Скляр, А. Трахтенберг. – СПб.: BHV-Санкт-Петербург, 2007. 27 Томсон, Л. Разработка Web-приложений на PHP и MySQL / Л. Томсон, Л. Веллинг. – М.: ДиаСофтЮП, 2003. 28 Томсон, Л. Разработка Web-приложений на PHP и MySQL / Л. Томсон, Л. Веллинг. – М.: Диасофт, 2001. 29 Ульман, Л. Основы программирования на РНР. Самоучитель / Л. Ульман. – М.: ДМК Пресс, 2001. 30 Уэнц, К. PHP. Сборник готовых рецептов / К. Уэнц. – М.: Вильямс, 2006. 31 Фленов, М. PHP глазами хакера / М. Фленов. – М.: BHV, 2005. 32 Фролов, А. Практика применения Perl, PHP, Apache, MySQL для активных Web-сайтов / А. Фролов, Г. Фролов. – М.: Русская Редакция, 2002. 33 Харрис, Э. PHP/MySQL для начинающих / Э. Харрис. – М.: Кудиц-Образ, 2007. 34 Хольцнер, С. PHP в примерах / С. Хольцнер. – М.: Бином-Пресс, 2007 35 Черный, А.И. Самоучитель FLASH и PHP / А.И. Черный. – М.: Питер, 2004. 36 Швендимен, Бл. PHP 4. Руководство разработчика / Бл. Швендимен. – М.: Вильямс, 2002. 37 Шкрыль, А. PHP – это просто. Программируем для Web-сайта / А. Шкрыль. – М.: BHV, 2006. 38 Шлосснейгл, Дж. Профессиональное программирование на PHP / Дж. Шлосснейгл. – М.: Вильямс, 2005.
Учебное издание
Ружицкая Елена Адольфовна
РАЗРАБОТКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ НА ПЛАТФОРМЕ NET: PHP.NET Тексты лекций по спецкурсу для студентов специальности 1–40 01 01 «Программное обеспечение информационных технологий» специализации 1–40 01 01 01 «Компьютерные системы и Internet-технологии»
В авторской редакции
Подписано в печать 20.03.2008 г. (89). Формат издания 60x84 1/16. Бумага писчая №1. Печать на ризографе. Гарнитура Таймс. Усл.печ.л. 7,84. Уч-изд.л. 6,06. Тираж 20 экз.
Отпечатано в учреждении образования «Гомельский государственный университет имени Франциска Скорины», 246019 г. Гомель, ул. Советская, 104
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|