Лекция: Кодирование набора данных формы
Перед передачей на сервер набор данных формы кодируется в соответствии со значением атрибута ENCTYPE элемента FORM, который определяет тип содержимого, соответствующий пересылаемым данным. Клиентские браузеры должны поддерживать перечисленные в следующем разделе типы содержимого, в противном случае их поведение в процессе обработки формы будет непредсказуемо.
Tuп содержимого «application/x-www-form-urlencoded»
Этот тип содержимого используется по умолчанию. Набор данных формы, кодируемый согласно данному типу содержимого, составляется следующим образом.
• Из формы извлекаются имена и значения элементов управления, после чего символы пробелов заменяются символами +. Символы, не являющиеся буквами или цифрами, заменяются кодом %НН, где за знаком процента следуют шестнадцатеричные цифры, представляющие код ASCII этого символа. Разрывы строк представляются парами CRLF (т.е. значением %OD%OA).
• Пары имя/значение элементов управления перечисляются согласно их позиции в тексте документа. Имя отделяется от значения с помощью символа =, а пары имя/значение отделяются друг от друга символом &.
Рассмотрим, например, следующую форму.
Подтверждение этой формы с введенным именем подписчика Ivan Petrov и адресом электронной почты petrov@email.com приведет к отправке такого набора данных формы:
firstname=lvan&lastname=Petrov&postal-
address=petrov@email.com&subscribe=on
Tun содержимого «multipart/form-data»
Тип содержимого «application/x-www-form-urlencoded» неэффективен для отправки большого количества двоичных данных или текста, содержащего символы, не входящие в набор ASCII. Для отправки набора данных формы, содержащего файлы или данные с символами, не входящими в набор ASCII, или двоичные данные, больше подходит тип содержимого «multipart/form-data».
Сообщение с типом содержимого «multipart/form-data» состоит из нескольких частей, каждая их которых представляет успешный элемент управления. Эти части пересылаются в программу обработки формы в том порядке, в котором соответствующие им элементы управления представлены в документе HTML. Каждая часть может содержать необязательный заголовок «Content-Type», значение которого по умолчанию равно «text/plain». Кроме этого, каждая часть должна содержать следующие компоненты.
• Заголовок «Content-Disposition», имеющий значение «form-data».
• Атрибут имени соответствующего элемента управления.
Например, для элемента управления с именем «control-name» соответствующая часть набора данных формы может выглядеть так:
Content-Disposition: form-data; name=«control-name»
Если в наборе данных формы передаются данные, хранимые в файле, для этих данных должен быть определен тип содержимого (например, «application/octet-stream»). Если с помощью одного элемента формы было выбрано несколько файлов, они должны пересылаться с указанием типа содержимого «multipart/mixed».
В следующем примере показан результат кодирования согласно типу содержимого «multipart/form-data». Предположим, у нас имеется следующая форма.
Если пользователь введет в текстовое поле слово "Ivanov" и выберет текстовый файл "content.txt", то после подтверждения формы браузер отправляет следующий набор данных формы.
Здесь использован обязательный параметр boundary, задающий строку, разделяющую части передаваемых данных. Если пользователь выбрал второй файл с изображением "logo.gif", то клиентский браузер отправляет следующие части набора данных формы.
Итак, мы уже знаем, как следует подготавливать набор данных формы, предназначенный для передачи программе-сценарию для их обработки. Рассмотрим, как это происходит.