Тип содержимого multipart/form-data — это составной тип содержимого, чаще всего использующийся для отправки HTML-форм с бинарными (не-ASCII) данными методом POST протокола HTTP. Указывается в поле заголовка Content-Type (тип содержимого) и следует правилам для составных MIME-данных в соответствии с RFC 2045. Для форм, не имеющих больших бинарных (не-ASCII) данных, может использоваться тип содержимого application/x-www-form-urlencoded.
Сообщение multipart/form-data содержит несколько частей, по одной на каждый задействованный в форме элемент управления.
Типичный пример: страницы отправки электронных писем через webmail со вложенными файлами. При отправке такого письма браузер формирует сообщение типа multipart/form-data, внедряя в него как отдельные части, введённые пользователем, тему, адрес получателя, собственно текст письма, так и вложенные файлы.
Сообщение типа multipart/form-data состоит из нескольких частей, каждая из которых представляет содержимое некоторого элемента формы. Части отправляются обрабатывающему агенту в том же порядке, в котором соответствующие управляющие элементы представлены в потоке документа с формой. Каждая часть должна содержать:
Заголовочное поле Content-Disposition, имеющее значение form-data.
Атрибут name определяет имя соответствующего управляющего элемента. Имена управляющих элементов, изначально закодированные с использованием наборов символов, отличных от ASCII, могут кодироваться с помощью метода, описанного в RFC 2047[1].
Если вы не согласны с этим, пожалуйста, покажите в тексте существенность излагаемого материала. В противном случае раздел может быть удалён. Подробности могут быть на странице обсуждения.
Пример отправки веб-формы с письмом со вложенными картинками:
POST /send-message.html HTTP/1.1
Host: webmail.example.com
Referer: http://webmail.example.com/send-message.html
User-Agent: BrowserForDummies/4.67b
Content-Type: multipart/form-data; boundary=Asrf456BGe4h
Content-Length: (суммарный объём, включая дочерние заголовки)
Connection: keep-alive
Keep-Alive: 300
(пустая строка)(отсутствующая преамбула)
--Asrf456BGe4h
Content-Disposition: form-data; name="DestAddress"
(пустая строка)[email protected]
--Asrf456BGe4h
Content-Disposition: form-data; name="MessageTitle"
(пустая строка)
Я негодую
--Asrf456BGe4h
Content-Disposition: form-data; name="MessageText"
(пустая строка)
Привет, Василий! Твой ручной лев, которого ты оставил
у меня на прошлой неделе, разодрал весь мой диван.
Пожалуйста забери его скорее!
Во вложении две фотки с последствиями.
--Asrf456BGe4h
Content-Disposition: form-data; name="AttachedFile1"; filename="horror-photo-1.jpg"
Content-Type: image/jpeg
(пустая строка)(двоичное содержимое первой фотографии)
--Asrf456BGe4h
Content-Disposition: form-data; name="AttachedFile2"; filename="horror-photo-2.jpg"
Content-Type: image/jpeg
(пустая строка)(двоичное содержимое второй фотографии)
--Asrf456BGe4h--
(отсутствующий эпилог - пустая строка)
Следует отметить, что boundary (граница) — это последовательность байтов, которая не должна встречаться внутри закодированного представления данных части. Обычно клиент (браузер) генерирует эту последовательность случайно или по специальному алгоритму.