Яка межа в мультичастинах / формах-даних?


403

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

Чи ???вільний повинен визначати користувач? Або він генерується з HTML? Чи можна для мене визначити ??? = abcdefg?


2
Я виявив, що це відповідь. w3.org/TR/html401/interact/forms.html#h-17.13.4.2
запитання

Відповіді:


424

Чи ???вільний повинен визначати користувач?

Так.

або це постачається 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, що надсилаються серверу.

  • Будьте послідовними та використовуйте однакове значення скрізь у повідомленні запиту.


54
В кінці межі доведеться додати додатковий знак "-".
Себастьян Піскорський

13
Ви можете прочитати це в документації. Помежні закінчення повинні мати додаткові два гіпена "-" Посилання: w3.org/TR/html401/interact/forms.html#h-17.13.4.2
Себастьян Піскорський

6
Чудова відповідь. Межа - це лише "ключ" для розділення декількох "частин" багаточастинного корисного навантаження. Зазвичай чогось типу "&" достатньо для розділення змінних, але вам потрібно щось більш унікальне, щоб розділити корисні навантаження в межах корисного навантаження.
користувач2483724

1
@ K3rnel31 Звичайно, якщо тільки новий граничний рядок не має тієї ж довжини.
Оскар Медерос

5
Я думаю, що граничне значення, яке задекларовано у заголовку типу вмісту, буде насправді -XXX --- тому, що при розділенні частин слід писати додатковий "-" (звідси --- XXX ---)
Теодор К .

96

Точна відповідь на питання: так, ви можете використовувати довільне значення для 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. Тип мультимедіа-носія

    Як зазначено у визначенні поля Content-Transfer-Encoding [RFC 2045], жодне кодування, окрім "7bit", "8bit" або "binary", не допускається для об'єктів типу "multipart". "Багаточастинні" граничні роздільники та поля заголовків завжди представлені як 7-бітні US-ASCII в будь-якому випадку (хоча поля заголовка можуть кодувати текст не в заголовку США-ASCII відповідно до RFC 2047), а дані в частинах тіла можуть бути кодовані на по частинах, із полями передачі-кодування вмісту для кожної відповідної частини тіла.

    Поле "Тип вмісту" для багаточастинних об'єктів вимагає одного параметра "межа". Лінія розмежувача кордону потім визначається як рядок, що складається повністю з двох дефісних символів ("-", десяткове значення 45) з подальшим значенням граничного параметра з поля заголовка "Тип вмісту", необов'язкового лінійного пробілу та закінчуючого 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--

2
Мені найбільше подобається ця відповідь, тому що вона цитує RFC про те, як конкретизуються дефіси .
Рік

@Rick Є поважна причина для IETF зробити це - хоча всі вони виглядають майже однаково, лише одна з наступних чотирьох - це правильний дефіс: ˗ - - -
антихрис

га, коли я говорив про гіпси, я маю на увазі, що у вашій відповіді було сказано, які гіпети визначаються у стандарті. Мене збентежило те, які гіпси "визначені клієнтом", а які - "специфікацією визначено"
Рік

31

multipart / form-data містить межу для розділення пар імен / значень. Межа діє як маркер кожної частини імен / значень пар, переданих при надходженні форми. Межа автоматично додається до типу вмісту заголовка запиту.

Форма з атрибутом enctype = "multipart / form-data" матиме заголовок запиту Content-Type: Contentpart / multi -data-data; межа --- 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 ("багаточастинні / форма-дані").

Остерігайтеся, під час тестування веб-сервісу за допомогою хромованого листоноші потрібно перевірити параметр даних форми (перемикач) та меню Файл у спадному вікні, щоб надіслати вкладення. Явне надання типу вмісту у вигляді багаточастинних / форм-даних призводить до помилки. Оскільки межа відсутня, оскільки вона перекриває запит на вигин поштового чоловіка на сервер із типом контенту, додаючи межу, яка працює добре.

Див. RFC1341, розділ 7.2 Багаточастинковий тип вмісту

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.