Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Multipart-формы, тег выбора файла




Слово «закачать» обозначает загрузку файла клиента на сервер, и термин «скачать» – обратный процесс (с сервера – клиенту).

В большинстве случаев данные из формы в браузере, передающиеся методом 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...