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