![]() |
||
|
aranea.ru || Спецификация HTML 4.01 | 17. Формы
17. Формы17.13. Предоставление формы17.13.1. Метод предоставления формы17.13.2. Успешное управление 17.13.3. Обработка данных формы Шаг первый: идентификация успешного управления Шаг второй: построение набора данных формы Шаг третий: кодирование набора данных формы Шаг четвертый: предоставление закодированного набора данных формы 17.13.4. Типы содержания формы application/x-www-form-urlencoded multipart/form-data Следующие разделы объясняют, как устройства вывода предоставляют данные формы для агентов, обрабатывающих форму. 17.13.1 Метод предоставления формыАтрибут method для элемента FORM определяет метод HTTP, используемый для посылки формы обрабатывающему агенту. Этот атрибут может принимать два значения:
Метод "get" следует использовать, когда форма идемпотентная (т.е. не приводит к побочным эффектам). Многие поиски в базах данных не имею видимого побочного эффекта, и это делает их идеальными для применение метода "get". Если сервис, связанный с обработкой формы, приводит к побочным эффектам (например, если форма модифицирует базу данных или подписку на сервис), необходимо использовать метод "post". Обратите внимание. Метод "get" ограничивает значения набора данных формы до символов ASCII. Только метод "post" (с enctype="multipart/form-data") определяется для включения всего набора символов [ISO10646]. 17.13.2 Успешное управлениеУспешное управление является "корректным" ("valid") для предоставления. Каждое успешное управление имеет имя управления в паре с его текущим значением предоставляемого набора данных формы. Успешное управление должно определяться внутри элемента FORM и должно иметь имя управления. Но:
Если управление не имеет текущего значения, когда представляется форма, то устройства вывода не обязаны обращаться с ними как с успешным управлением. Более того, устройствам вывода не следует рассматривать следующие управления как успешные:
Скрытое управление и управление, которое не визуализируется из-за установки стилевых таблиц, могут все же быть успешными. Например:
<FORM action="..." method="post">
<P>
<INPUT type="password" style="display:none"
name="invisible-password"
value="mypassword">
</FORM>
все же приведет к тому, что значение будет в паре с именем "invisible-password", и передается вместе с формой. 17.13.3 Обработка данных формыКогда пользователь предоставляет форму (например, активируя кнопку предоставления (submit button)), то устройство вывода обрабатывает ее следующим образом. Шаг первый: идентификация успешного управленияШаг второй: построение набора данных формыНабор данных формы является последовательностью пар имя-управления/текущее-значение, построенных из успешных управлений. Шаг третий: кодирование набора данных формыНабор данных формы затем кодируется в соответствии с типом содержания, определенным в атрибуте enctype элемента FORM. Шаг четвертый: предоставление закодированного набора данных формыВ заключении, закодированные данные посылаются на агент обработки, обозначенный в атрибуте action с использованием протокола, установленного в атрибуте method. Эта спецификация не определяет все корректные методы передачи или типы содержания, которые могут использоваться с формами. Но, устройства вывода HTML 4 должны поддерживать установленные договоренности в следующих случаях:
Для любых других значений action или method, поведение не определено. Устройствам вывода следует визуализировать ответ от транзакций HTTP "get" и "post". 17.13.4 Типы содержания формыАтрибут enctype элемента FORM определяет тип содержания, используемого для кодировки набора данных формы для передачи серверу. Устройства вывода должны поддерживать типы содержания, приведенные ниже. Поведение для других типов содержания не определены. Обратитесь так же к разделу об обходе амперсандов в значениях атрибутов URI application/x-www-form-urlencodedЭтот тип содержания используется по умолчанию. Формы, предоставляемые с этим типом содержания, должны кодироваться следующим образом:
multipart/form-dataОбратите внимание. Обратитесь к [RFC2388] для получения дополнительной информации о загрузке на сервер файлов, включая вопросы обратной совместимости, связи между "multipart/form-data" и другими типами содержания, вопросами выполнения и т.д. Тип содержания "application/x-www-form-urlencoded" является не эффективным для посылки большого количество бинарных данных или текста, содержащего символы, не входящие в ASCII. Тип содержания "multipart/form-data" следует использовать для подачи форм, которые содержат файлы, данные с символами не ASCII и бинарные данные. Содержание "multipart/form-data" следует правилам всех многостраничных потоков данных MIME, как это очерчено в [RFC2045]. Определение "multipart/form-data" доступно в регистре [IANA]. Сообщение "multipart/form-data" содержит серию частей, каждая из которых включает успешное управление. Части посылаются агенту обработки в том же порядке, что и соответствующие управления появляются в потоке документа. Границы частей не должны появляться где-либо в данных; как это осуществляется, не является темой данной спецификации. Как все многостраничные типы MIME, каждая часть имеет факультативный заголовок "Content-Type", который – по умолчанию "text/plain". Устройствам вывода следует предоставлять заголовок "Content-Type", сопровождающий параметр "charset". Каждая часть, как ожидается, содержит:
Таким образом, например, для управления под именем "mycontrol", соответствующая часть будет определена: Content-Disposition: form-data; name="mycontrol" Со всеми передачами MIME, "CR LF" (т.е. `%0D%0A') используется для разделения строк данных. Каждая часть может быть закодирована с предоставлением заголовка "Content-Transfer-Encoding", если значение такой части не согласуется с кодировкой по умолчанию (7BIT) (смотрите [RFC2045], раздел 6) Если содержание файла передается с формой, то ввод файла должен идентифицироваться соответствующим типом содержания (например, "application/octet-stream"). Если несколько файлов возвращаются как результат единого ввода формы, то они должны вернуться как "multipart/mixed", вложенные внутри "multipart/form-data". Устройствам вывода следует пытаться предоставить имя файла для каждого переданного файла. Имя файла может быть определено параметром "filename" заголовка 'Content-Disposition: form-data', или в случае с несколькими файлами в заголовке подчасти 'Content-Disposition: file'. Если имя файла операционной системы клиента - не US-ASCII, то для имени такого файла может осуществляться аппроксимация или кодировка с использованием метода [RFC2045]. Это удобно для тех случаев, когда, например, загружаемые на сервер файлы могли бы содержать ссылки друг на друга (например, TeX файл и его вспомогательное описание стиля ".sty"). Следующий пример иллюстрирует кодировку "multipart/form-data". Предположим, что мы имеем следующую форму:
<FORM action="http://server.com/cgi/handle"
enctype="multipart/form-data"
method="post">
<P>
What is your name? <INPUT type="text" name="submit-name"><BR>
What files are you sending? <INPUT type="file" name="files"><BR>
<INPUT type="submit" value="Send"> <INPUT type="reset">
</FORM>
Если пользователь вводит "Larry" в текстовой ввод и выбирает файл "file1.txt", то устройство вывода могло бы послать следующие данные: Content-Type: multipart/form-data; boundary=AaB03x --AaB03x Content-Disposition: form-data; name="submit-name" Larry --AaB03x Content-Disposition: form-data; name="files"; filename="file1.txt" Content-Type: text/plain ... contents of file1.txt ... --AaB03x-- Если пользователь выбрал второй файл (изображение) "file2.gif", то устройство вывода могло бы сконструировать части следующим образом: Content-Type: multipart/form-data; boundary=AaB03x --AaB03x Content-Disposition: form-data; name="submit-name" Larry --AaB03x Content-Disposition: form-data; name="files" Content-Type: multipart/mixed; boundary=BbC04y --BbC04y Content-Disposition: file; filename="file1.txt" Content-Type: text/plain ... contents of file1.txt ... --BbC04y Content-Disposition: file; filename="file2.gif" Content-Type: image/gif Content-Transfer-Encoding: binary ...contents of file2.gif... --BbC04y-- --AaB03x--4 |