Как границы работают в многочастных почтовых запросах? - PullRequest
1 голос
/ 26 октября 2010

Я пытаюсь загрузить файл с iPhone на сервер.Я стараюсь избегать использования каких-либо библиотек, которые не созданы Apple, и из того, что я могу сказать, похоже, мне нужно пойти на довольно низкий уровень при построении моего запроса.Может кто-нибудь сказать мне, что такое «граница» в запросе multipart / form-data и как его правильно использовать?

1 Ответ

6 голосов
/ 26 октября 2010

Граница - это произвольный фрагмент текста, который клиент использует для разделения полей публикуемой формы. Клиент объявляет границу, которую он использует, как часть заголовка Content-type.

Из IETF Загрузка файлов на основе форм в формате HTML RFC :

Выбрана граница, которая не встречается ни в одном из данных. (Это отбор иногда делается вероятностно.) Каждое поле формы отправляется в порядке, в котором это происходит в форме, как часть многочастный поток. Каждая часть идентифицирует имя INPUT в пределах оригинальная форма HTML. Каждая часть должна быть помечена соответствующим content-type, если тип носителя известен (например, выведен из файла информация о расширении или операционной системе) или как приложения / октет-поток.

...

6. Примеры

Предположим, сервер предоставляет следующий HTML-код:

<FORM ACTION="http://server.dom/cgi/handle"
       ENCTYPE="multipart/form-data"
       METHOD=POST>
 What is your name? <INPUT TYPE=TEXT NAME=submitter>
 What files are you sending? <INPUT TYPE=FILE NAME=pics>
 </FORM>

и пользователь вводит «Джо Блоу» в поле имени и выбирает текст файл "file1.txt" для ответа на вопрос "Какие файлы вы отправляете?"

Клиент может отправить обратно следующие данные:

   Content-type: multipart/form-data, boundary=AaB03x

   --AaB03x
   content-disposition: form-data; name="field1"

   Joe Blow
   --AaB03x
   content-disposition: form-data; name="pics"; filename="file1.txt"
   Content-Type: text/plain

    ... contents of file1.txt ...
   --AaB03x--

Если пользователь также указал файл изображения "file2.gif" для ответа на «Какие файлы вы отправляете?», клиент может отправить клиент обратно следующие данные:

   Content-type: multipart/form-data, boundary=AaB03x

   --AaB03x
   content-disposition: form-data; name="field1"

   Joe Blow
   --AaB03x
   content-disposition: form-data; name="pics"
   Content-type: multipart/mixed, boundary=BbC04y

   --BbC04y
   Content-disposition: attachment; filename="file1.txt"

В первом примере границей является фиксированная строка AaB03x. Во втором примере граница сначала AaB03x, а затем переключается на BbC04y.

...