html - que - form multipart file
¿Por qué se requiere formulario enctype=multipart/form-data al cargar un archivo? (2)
Esa es parte de la especificación para la carga de archivos HTML como se describe en RFC-1867 , que fue la propuesta para permitir cargas de archivos en formularios HTML (alrededor de 1995).
De la sección 2:
Esta propuesta realiza dos cambios a HTML:
1) Agregue una opción FILE para el atributo TYPE de INPUT.
2) Permitir un atributo ACEPTO para la etiqueta ENTRADA, que es una lista de tipos de medios o patrones de tipo permitidos para la entrada.Además, define un nuevo tipo de medio MIME, multipart / form-data , y especifica el comportamiento de los agentes de usuario HTML al interpretar un
formulario conENCTYPE="multipart/form-data"
y / o<INPUT type="file">
etiquetas.
Cuando configura enctype
a multipart/form-data
, el navegador separa cada archivo o archivo adjunto en la carga con un "límite de varias partes", que es un identificador único que define el comienzo y el final de cada "parte".
Eso le permite al navegador enviar varias partes (de ahí el nombre) en una solicitud e identificar cada una con sus propios metadatos, como tipo de mimo, nombre de archivo, etc.
¿Por qué se <form enctype=multipart/form-data>
al cargar un archivo a un servidor web?
Tiene que ver con cómo el navegador empaqueta binario y forma datos para la transmisión a través de HTTP. De forma predeterminada, solo se envían los datos del formulario, pero si el formulario necesita ser compatible con la carga de un archivo, los datos binarios también deben adjuntarse y separarse de los datos del formulario.
Scott Hanselman da una buena explicación de esto here :
HTTP y cómo funciona la carga de archivos a través de HTTP
Siempre es mejor para mí entender por qué y cómo está sucediendo algo. Si dices "solo porque" o "lo que sea, simplemente agrega eso y funciona", entonces creo que es triste. Por alguna razón, mientras que muchas personas entienden FORMULARIOS POST y, en general, cómo se pasan los datos del formulario al servidor, cuando se transfiere un archivo, muchos concluyen que es mágico. ¿Por qué tenemos que agregar enctype = "multipart / form = data" en nuestros formularios que incluyen cargas de archivos? Porque el formulario ahora se PUBLICARÁ en varias partes.
Si tienes un formulario como este:
<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>
El formulario POST resultante se verá así (ligeramente simplificado):
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--
Observe algunas cosas sobre este POST. Primero, observe el tipo de contenido y el límite = "" y cómo se usa el límite más adelante, exactamente como ese, un límite entre las partes múltiples. Vea cómo la primera parte muestra que cargué un solo archivo, de tipo texto / plano. Puede interpolar a partir de esto cómo esperaría que aparecieran varios archivos si todos estuvieran POSTados a la vez.
Y, por supuesto, mire lo diferente que se vería si solo fuera una forma básica POST sin el enctype = "multipart / form = data" incluido:
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
¿Ves cómo el tipo de contenido es diferente? Esta es una forma regular, típica de POST. ¡Quizás atípico en que incluye solo un botón Enviar! ....
Además, si mira un correo electrónico suyo con varios archivos adjuntos, se verá MUY similar al cuerpo del primer mensaje HTTP ya que la codificación MIME multiparte se encuentra en todas partes, como es común con la mayoría de las buenas ideas.