Какова граница в multipart/form-data?
Я хочу задать вопрос о multipart/form-data
. В заголовке HTTP я обнаружил, что Content-Type: multipart/form-data; boundary=???
Content-Type: multipart/form-data; boundary=???
,
Это ???
свободно быть определенным пользователем? Или это сгенерировано из HTML? Можно ли мне определить ??? = abcdefg
??? = abcdefg
?
Ответы
Ответ 1
Является ли ???
свободно быть определенным пользователем?
Да.
или он предоставляется 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-данных, отправленных на сервер.
-
Будьте последовательны и используйте одно и то же значение везде в сообщении запроса.
Ответ 2
Точный ответ на вопрос: да, вы можете использовать произвольное значение для параметра boundary
, если оно не превышает 70 байт и состоит только из 7-разрядные US-ASCII
(печатные) символы.
Если вы используете один из типов содержимого multipart/*
, вам действительно необходимо указать параметр boundary
в заголовке Content-Type
, иначе сервер (в случае HTTP-запроса) не сможет проанализируйте полезную нагрузку.
Вероятно, вы также захотите установить параметр charset
в UTF-8
в заголовке Content-Type
, если вы не можете быть абсолютно уверены, что в данных полезной нагрузки будет использоваться только US-ASCII
charset.
Несколько релевантных выписок из RFC2046:
Вот пример использования произвольной границы:
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--
Ответ 3
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 Postman вам необходимо проверить опцию данных формы (переключатель) и меню "Файл" из выпадающего списка, чтобы отправить вложение. Явное предоставление типа содержимого как multipart/form-data приводит к ошибке. Потому что граница отсутствует, так как она переопределяет запрос curl почтового человека на сервер с типом контента, добавляя границу, которая работает нормально.
См. RFC1341 sec7.2 Multipart Content-Type.