Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

Если у вас есть такая форма:

<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. Во-первых, обратите внимание на контент-тип и границу = "" и как граница используется позже, как именно это, граница между несколькими частями. Посмотрите, как первая часть показывает, что я загрузил один файл, типа text/plain. Вы можете интерполировать из этого, как вы ожидаете, что несколько файлов будут отображаться, если они были все POSTed сразу.

И, конечно, посмотрите, как это выглядело бы иначе, если бы это была просто базовая форма 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 встречается везде, как это обычно бывает с большинством хороших идей.

Ответ 2

Это часть спецификации для загрузки файлов HTML, как описано в RFC-1867, которая была предложением разрешить загрузку файлов в HTML форм (около 1995 г.).

Из раздела 2:

Это предложение вносит два изменения в HTML:

1) Добавьте параметр FILE для атрибута TYPE INPUT.
   2) Разрешить атрибут ACCEPT для тега INPUT, который является списком       типы носителей или шаблоны типов, разрешенные для ввода.

Кроме того, он определяет новый тип мультимедиа MIME, multipart/form-data​​strong > , и определяет поведение пользовательских агентов HTML при интерпретации формы с ENCTYPE="multipart/form-data" и/или <INPUT type="file">
теги.

Когда вы устанавливаете enctype в multipart/form-data, браузер отделяет каждый файл или вложение в загрузке с помощью "многострочной границы", которая является уникальным идентификатором, который определяет начало и конец каждой "части".

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