Почему форма enctype=multipart/form-data требуется при загрузке файла?

Можно использовать веб-сервисы MapPoint Microsoft.

я создал запись в блоге о том, как преобразовать адрес в GeoCode (lat/long).

45
задан isapir 16 May 2019 в 00:35
поделиться

1 ответ

Это связано с тем, как браузер упаковывает двоичные файлы и формирует данные для передачи по HTTP. По умолчанию отправляются только данные формы, но если форма должна поддерживать загрузку файла, то двоичные данные также должны быть добавлены и отделены от данных формы.

Скотт Хансельман дает хорошее объяснение здесь :

HTTP и как работает загрузка файлов через HTTP

Для меня всегда лучше понимать, ПОЧЕМУ и КАК что-то происходит. Если вы скажете «просто потому, что» или «что-то еще, вы просто добавите это, и это сработает», тогда я думаю, что это печально. По некоторым причинам, хотя многие люди понимают FORM POST и, как правило, то, как данные формы передаются на сервер, при передаче файла многие просто считают, что это волшебство. Почему нам нужно добавлять enctype = "multipart / form = data" в наших формах, которые включают загрузку файлов? Поскольку форма теперь будет размещена в нескольких частях.

Если у вас есть форма, подобная этой:

<form action="/home/uploadfiles" method="post" enctype="multipart/form-data">
    <label for="file">Filename:</label>
    <input type="file" name="file" id="file" />
    <input type="submit" name="submit" value="Submit" />
</form>

Полученная форма POST будет выглядеть следующим образом (немного упрощенно):

POST /home/uploadfiles HTTP/1.1
Content-Type: multipart/form-data; boundary=---------------------------7d81b516112482 
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64)
Content-Length: 324

-----------------------------7d81b516112482 
Content-Disposition: form-data; name="file"; filename="\\SERVER\Users\Scott\test.txt"
Content-Type: text/plain

foo
-----------------------------7d81b516112482
Content-Disposition: form-data; name="submit"

Submit
-----------------------------7d81b516112482--

Обратите внимание на некоторые особенности этого POST. Во-первых, обратите внимание на content-type и Border = "" и на то, как граница будет использоваться позже, а именно на границу между несколькими частями. Посмотрите, как в первой части показано, что я загрузил один файл типа text / plain. Из этого вы можете интерполировать, как вы ожидали бы появления нескольких файлов, если бы все они были отправлены на POST одновременно.

И, конечно же, посмотрите, как бы это выглядело, если бы это была обычная POST-форма без enctype = " multipart / form = data "включены:

POST /home/uploadfiles HTTP/1.1 
Content-Type: application/x-www-form-urlencoded
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64)
Content-Length: 13

submit=Submit

Видите, чем отличается тип содержимого? Это обычная типовая форма POST. ....

Кстати, если вы посмотрите на свое электронное письмо с несколькими прикрепленными файлами, оно будет выглядеть ОЧЕНЬ похожим на тело первого сообщения HTTP, поскольку многостраничная кодировка MIME встречается повсюду, как это обычно бывает с большинством хорошие идеи.

76
ответ дан 26 November 2019 в 21:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: