- •Тема 1 Основы cgi-программирования
- •1.1 Методы передачи данных
- •1.2 Передача документа пользователю
- •1.3 Передача информации cgi-сценарию
- •Тема 2 Характеристика языка php
- •2.1 Принцип работы php
- •2.2 Переменные, константы, выражения
- •Тема 3 Работа с данными формы
- •3.1 Передача данных
- •3.2 Трансляция полей формы в переменные
- •Тема 4 Конструкции языка
- •4.1 Условные инструкции
- •4.2 Инструкции циклов
- •4.3 Инструкции включения
- •Тема 5 Ассоциативные массивы
- •5.1 Списки и ассоциативные массивы
- •5.2 Операции над массивами
- •5.3 Списки и строки
- •5.4 Сериализация
- •Тема 6 Работа с массивами
- •6.1 Сортировка массивов
- •6.2 Функции для работы с массивами
- •Тема 7 Функции и области видимости
- •7.1 Формат определения функции, передача параметров
- •7.2 Глобальные, локальные, статические переменные
- •7.3 Рекурсия, вложенные и условно-определяемые функции
- •7.4 Передача функций по ссылке и возврат функцией ссылки
- •Тема 8 Строковые функции
- •8.1 Функции работы со строками
- •8.2 Работа с блоками текста
- •Тема 9 Математические функции
- •9.1 Встроенные константы
- •9.2 Встроенные функции
- •Тема 10 Работа с файлами и каталогами,
- •10.1 Функции работы с файлами
- •10.2 Блокирование файла
- •10.3 Функции работы с каталогами
- •10.4 Запуск внешних программ
- •Тема 11 Работа с датами и временем,
- •11.1 Представление времени в формате timestamp
- •11.2 Работа с датами, григорианский календарь
- •11.3 Посылка писем через php
- •Тема 12 Работа с www
- •12.1 Установка заголовков ответа
- •12.2 Работа с Cookies
- •Тема 13 Управление интерпретатором
- •13.1 Управление интерпретатором
- •13.2 Управление сессиями
- •Тема 14 Работа с базой данных mysql
- •14.1 Соединение с базой данных
- •14.2 Выполнение запросов к базе данных
- •Тема 15 Загрузка файлов на сервер
- •15.1 Multipart-формы, тег выбора файла
- •15.2 Поддержка закачки в php
- •Учебное издание
- •Разработка программного обеспечения на платформе net: php.Net
- •246019 Г. Гомель, ул. Советская, 104
Тема 15 Загрузка файлов на сервер
15.1 Multipart-формы, тег выбора файла
15.2 Поддержка закачки в PHP
15.1 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.
