it-swarm.com.ru

Какова граница в multipart / form-data?

Я хочу задать вопрос о multipart/form-data. В заголовке HTTP я обнаружил, что Content-Type: multipart/form-data; boundary=???.

Является ли ??? свободным для определения пользователем? Или это сгенерировано из HTML? Могу ли я определить ??? = abcdefg?

330
Questions

Является ли ??? свободным для определения пользователем?

Да.

или это предоставляется HTML?

Нет. HTML не имеет никакого отношения к этому. Читай ниже.

Могу ли я определить ??? как abcdefg?

Да.

Если вы хотите отправить следующие данные на веб-сервер:

name = John
age = 12

использование application/x-www-form-urlencoded будет выглядеть так:

name=John&age=12

Как видите, сервер знает, что параметры разделены амперсандом &. Если для значения параметра требуется &, то он должен быть закодирован.

Так как же сервер узнает, где начинается и заканчивается значение параметра, когда он получает HTTP-запрос, используя multipart/form-data?

Использование границы , аналогично &.

Например:

--XXX
Content-Disposition: form-data; name="name"

John
--XXX
Content-Disposition: form-data; name="age"

12
--XXX--

В этом случае граничным значением является XXX. Вы указываете его в заголовке Content-Type, чтобы сервер знал , как разделить полученные им данные.

Так что вам нужно:

  • Используйте значение, которое не будет отображаться в данных HTTP, отправляемых на сервер.

  • Будьте последовательны и используйте одно и то же значение везде в сообщении запроса.

355
Oscar Mederos

Точный ответ на вопрос: да, вы можете использовать произвольное значение для параметра boundary, если оно не превышает 70 байт и состоит из только 7-битный US-ASCII (для печати) символов.

Если вы используете один из типов содержимого multipart/*, вы фактически обязаны указать параметр boundary в заголовке Content-Type, иначе сервер (в случае HTTP-запроса) не будет быть в состоянии разобрать полезную нагрузку.

Возможно, вы также захотите установить для параметра charset значение UTF-8 в заголовке Content-Type, если только вы не можете быть абсолютно уверены, что в данных полезной нагрузки будет использоваться только кодировка US-ASCII.

Несколько соответствующих выдержек из RFC2046 :

  • 4.1.2. Параметр Charset:

    В отличие от некоторых других значений параметров, значения параметра charset НЕ чувствительны к регистру. Набор символов по умолчанию, который должен приниматься при отсутствии параметра charset, - US-ASCII.

  • 5.1. Multipart Media Type

    Как указано в определении поля Content-Transfer-Encoding [RFC 2045], для объектов типа "multipart" не допускается никакая другая кодировка, кроме "7-битная", "8-битная" или "двоичная". "Составные" граничные разделители и поля заголовка всегда представлены как 7-битный US-ASCII в любом случае (хотя поля заголовка могут кодировать текст заголовка не-US-ASCII в соответствии с RFC 2047), а данные внутри частей тела могут быть закодированы на по частям, с полями Content-Transfer-Encoding для каждой подходящей части тела.

    Поле Content-Type для составных объектов требует один параметр, "border". Строка ограничителя границы затем определяется как строка, состоящая полностью из двух символов дефиса ("-", десятичное значение 45), за которыми следует значение параметра границы из поля заголовка Content-Type, необязательный линейный пробел и завершающий CRLF.

    Ограничители границ не должны появляться внутри инкапсулированного материала и должны содержать не более 70 символов, не считая двух ведущих дефисов.

    Линия границы раздела, следующая за последней частью тела, является выделенным разделителем, который указывает, что дальнейшие части тела не будут следовать. Такая разделительная линия идентична предыдущим разделительным линиям с добавлением еще двух дефисов после значения граничного параметра.

Вот пример использования произвольной границы:

Content-Type: multipart/form-data; charset=utf-8; boundary="another cool boundary"

--another cool boundary
Content-Disposition: form-data; name="foo"

bar
--another cool boundary
Content-Disposition: form-data; name="baz"

quux
--another cool boundary--
82
U-D13

multipart/form-data содержит границу для разделения пар имя/значение. Граница действует как маркер каждого куска пар имя/значение, переданных при отправке формы. Граница автоматически добавляется к типу содержимого заголовка запроса.

Форма с атрибутом enctype = "multipart/form-data" будет иметь заголовок запроса Content-Type: multipart/form-data; border --- WebKit193844043-h ( сгенерированный браузером vaue ).

Переданная полезная нагрузка выглядит примерно так:

Content-Type: multipart/form-data; boundary=---WebKitFormBoundary7MA4YWxkTrZu0gW

    -----WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name=”file”; filename=”captcha”
    Content-Type:

    -----WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name=”action”

    submit
    -----WebKitFormBoundary7MA4YWxkTrZu0gW--

Со стороны веб-сервиса, он используется в форме @Consumes ("multipart/form-data").

Помните, что при тестировании веб-службы с помощью chrome почтальона, вам необходимо проверить опцию данных формы (переключатель) и меню "Файл" в раскрывающемся списке, чтобы отправить вложение. Явное предоставление типа содержимого как multipart/form-data приводит к ошибке. Потому что граница отсутствует, поскольку она переопределяет запрос curl почтового человека на сервер с типом контента, добавляя границу, которая работает нормально.

Смотрите RFC1341 sec7.2 Multipart Content-Type

18
Yergalem