Почему при загрузке файла требуется форма enctype = multipart / form-data?
52515 просмотра
2 ответа
Почему <form enctype=multipart/form-data>
требуется при загрузке файла на веб-сервер?
Ответы (2)
76 плюса
Это связано с тем, как браузер упаковывает двоичные данные и формирует данные для передачи по HTTP. По умолчанию отправляются только данные формы, но если форма должна поддерживать загрузку файла, двоичные данные также должны быть добавлены и отделены от данных формы.
Скотт Хансельман дает хорошее объяснение этому здесь :
HTTP и как выгрузка файлов работает через HTTP
Мне всегда лучше понимать ПОЧЕМУ и КАК что-то происходит. Если вы говорите «только потому, что» или «что угодно, вы просто добавляете это, и это работает», тогда я думаю, что это грустно. По какой-то причине, хотя многие люди понимают 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 без включенного 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
Автор: Nathan Taylor Размещён: 27.08.2009 05:23Видите, как тип контента отличается? Это обычная, типичная форма POST. Возможно, нетипичным в том, что он включает только кнопку Отправить! ....
Кроме того, если вы посмотрите на свое электронное письмо с несколькими вложенными файлами, оно будет ОЧЕНЬ похоже на тело первого HTTP-сообщения, поскольку многокомпонентная кодировка MIME встречается повсеместно, как это часто бывает с большинством хороших идей.
2 плюса
Это является частью спецификации для загрузки файлов HTML, как описано в RFC-1867 , которая была предложением разрешить загрузку файлов в формах HTML (около 1995 г.).
Из раздела 2:
Это предложение вносит два изменения в HTML:
1) Добавьте опцию FILE для атрибута TYPE в INPUT.
2) Разрешить атрибут ACCEPT для тега INPUT, который представляет собой список типов медиа или шаблонов типов, разрешенных для ввода.Кроме того, он определяет новый тип мультимедиа MIME multipart / form-data и определяет поведение пользовательских агентов HTML при интерпретации
формы сENCTYPE="multipart/form-data"
и / или<INPUT type="file">
тегами.
Когда вы устанавливаете enctype
в multipart/form-data
, браузер разделяет каждый файл или вложение в загрузке с «составной границей», которая является уникальным идентификатором, который определяет начало и конец каждой «части».
Это позволяет браузеру отправлять несколько частей (отсюда и имя) в одном запросе и идентифицировать каждую из них своими метаданными, такими как тип mime, имя файла и т. Д.
Автор: isapir Размещён: 14.09.2017 12:14Вопросы из категории :
- html Определить часовой пояс пользователя
- html Как определить, какой из указанных шрифтов был использован на веб-странице?
- html Как мне дать моим веб-сайтам значок для iPhone?
- html Как отключить автозаполнение браузера в поле веб-формы / теге ввода?
- http Окончательное руководство по аутентификации на основе форм
- http Как бы вы внедрили аутентификацию на основе FORM без резервной базы данных?
- http Как загрузить файл через HTTP с помощью Python?
- http Как мы контролируем кэширование веб-страниц во всех браузерах?
- file-upload Как увеличить максимальный размер загружаемого файла в ASP.NET?
- file-upload Как загрузить файл с django (python) и s3?
- file-upload Разрешения django / file uploads
- file-upload Как мне установить папку с загруженными файлами для SWFUpload?
- specifications Каково использование / значение символа @ в именах переменных в C #?
- specifications How to encode the filename parameter of Content-Disposition header in HTTP?
- specifications Какие символы допустимы в имени атрибута HTML?
- specifications Почему при загрузке файла требуется форма enctype = multipart / form-data?
- rfc Какая разница в поведении между return-path, reply-to и from?
- rfc Номер последовательности TCP
- rfc Какими форматами даты являются временные метки RFC 2822, совместимые с IETF?