Типы содержимого формы
Атрибут enctype элемента FORM определяет тип содержимого, используемый при кодировке набора данных формы для отправки на сервер. ПА должен поддерживать типы содержимого, перечисленные ниже. Поведение для других типов содержимого не определено.
См. раздел о использовании escape-последовательностей для обозначения амперсандов в значениях атрибутов URI.
application/x-www-form-urlencoded
Это тип содержимого по умолчанию. Формы отправленные с содержимым этого типа, должны кодироваться так:
-
Имена ЭУ и значения переводятся в escape-последовательности. Символы пробелов заменяются '+', и затем зарезервированные символы переводятся в escape-последовательности, как описано в [RFC1738], раздел 2.2:
Неалфавитные символы заменяются '%HH', знаком процента и двумя 16-ричными цифрами, представляющими ASCII-код символа. Символы новой строки представляются парами "CR LF" (напр., '%0D%0A').
- Пары имя/значение перечисляются в том порядке, в котором они появляются в документе. Имя отделено от значения знаком '=' и пары имя/значение отделены друг от друга знаком '&'.
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".
Каждая часть должна содержать:
- заголовок "Content-Disposition", значением которого является "form-data".
- атрибут имя, определяющий имя соответствующего ЭУ. Имена ЭУ, кодированные в оригинале в не-ASCII наборе символов, могут быть кодированы с использованием метода, описанного в [RFC2045].
Таким образом, для ЭУ с именем "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> Как Вас зовут? <INPUT type="text" name="submit-name"><BR> Какие файлы Вы послали? <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
... содержимое файла file1.txt ... --AaB03x--
Если пользователь выделит второй (image) файл "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
... содержимое файла file1.txt ... --BbC04y Content-Disposition: file; filename="file2.gif" Content-Type: image/gif Content-Transfer-Encoding: binary
...содержимое файла file2.gif... --BbC04y-- --AaB03x--