Глава 18. Загрузка файлов по HTTP
Для чего вообще нужна загрузка файлов по HTTP? На самом деле, это очень удобно как для администратора, так и для пользователя. Дело в том, что не всегда есть возможность загружать файлы на сервер по протоколу FTP (как это делается в большинстве случаев). А вот послать через браузер по протоколу HTTP крайне удобно.
Данная глава содержит темы:
• пример формы ввода;
• скрипты для обработки принимаемых данных;
• возможные трудности.
18.1. Пример формы ввода
Представим, что у вас есть свой сайт, где вы бы хотели реализовать, например, загрузку фотографий посетителей вашего ресурса. В данном случае очень удобно воспользоваться именно технологией загрузки файлов по HTTP. Схема проста: посетитель выбирает нужный файл на своем жестком диске и нажимает кнопку «Отправить». Судите сами, что проще: использовать FTP или такую технологию. Нам кажется, выбор очевиден. Приведем пример такой формы:
<form method="post" enctype="multipart/form-data" action="">
<input size=40 type=file name=myfilel><br>
<input type=submit value="Отправить">
</form>
Результат выполнения программы представлен на рис. 18.1.
Рис. 18.1. Полученная форма
После того как посетитель нажмет кнопку «Отправить», файл передастся на сервер, где и считывается скриптом. После этого файл будет переименован (получит наиболее удобное для вас имя) и определен в тот каталог, который задаст непосредственно Web-мастер сайта. Что делать с полученным файлом — это уже ваше дело.Теперь подробно разберемся, что это за форма ввода и какие у нее есть особенности. Обратим внимание на форматтега <form>. Это обычная форма, но существует несколько условий его использования:
1. Передача параметров скрипту должна осуществляться методом Post, а не методом Get, который используется по умолчанию в том случае, если метод передачи данных (параметр method) не был определен для формы Web-мастером.
2. Очень важно четко определить content-type, с которым данные и будут передаваться на сервер. Это делается с помощью параметра enctype, который должен иметь значение multipart/form-data.
ВНИМАНИЕ
Обычно значение enctype другое, но если в форме есть элемент ввода с типом file, нужно использовать именно этот тип данных.
Итак, мы уже знаем, как будет выглядеть наш тег <form>:
<form method="post" enctype="multipart/form-data" action="/cgi-bin/upload.cgi">
В вышеприведенном теге привычный для большинства форм параметр action, который определяет, куда будут переданы результаты заполнения формы. В нашем случае это скрипт upload.cgi.
ВНИМАНИЕ
Имя скрипта и место его размещения может быть абсолютно произвольным. В данном случае расположение скрипта указано исключительно для примера.
Следующий шаг — это размещение стандартных элементов для нашей формы.
1. Элемент выбора файла:
<input type=file name=myfile1>
Ключ type с параметром file указывает на то, что в результирующем HTML-документе, который увидит посетитель сервера, будет форма ввода имени файла, а рядом кнопка, при нажатии на которую браузер откроет интерфейс выбора файла на жестком диске пользователя.
Параметр name=myfile1 указывает на то, что двоичные данные, из которых состоит файл, будут переданы скрипту в параметре myfile1. Именно этот параметр мы будем использовать, когда будем рассматривать процедуру принятия файла скриптом:.
2. Кнопка.
Чтобы отобразить в HTML-документе кнопку, при нажатии на которую начнется передача данных из формы, нужно добавитьв HTML-код такую строку:
<input type=submit value="Отправить">
После всего этого необходимо закрыть форму тегом </forni>. Теперь наша форма готова к полноценному выполнению поставленной задачи.