2009-08-27 23 views

Respuesta

58

Tiene que ver con cómo el navegador empaqueta binarios 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.

de Scott Hanselman da una buena explicación de este here:

HTTP y cómo funciona carga de archivos a través de HTTP

Es siempre mejor, para mí, para entender por qué y cómo algo está pasando. 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 usted tiene una forma como esta:

<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 de envío resultante tendrá este aspecto (ligeramente simplificada):

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-- 

Aviso unos pocos 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, un vistazo a la diferencia de este se vería si se tratara de un POST básica forma sin el enctype = "multipart/form = datos" 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 

ver cómo el 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! ....

Como un lado, si mira un correo electrónico suyo con múltiples archivos adjuntos, se vería MUY similar al cuerpo del primer mensaje HTTP como la codificación MIME multiparte se encuentra en todas partes, como es común con la mayoría de las buenas ideas.

+0

puede usted explicar lo que es datos binarios cuando cargando archivo de texto? Digamos que estoy cargando un archivo de texto, ¿por qué se puede enviar como parámetro de solicitud en el cuerpo del post donde el nombre del parámetro puede ser el nombre del archivo y el valor puede ser el contenido del archivo? Básicamente, si puedo pegar manualmente el contenido del archivo en el área de texto en HTML/JSP que se transfiere al servidor como parámetro de solicitud posterior normal que lo lee en el servidor, ¿por qué la carga de archivos requiere un formulario de varias partes? –

1

Eso 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 (circa 1995).

Desde la sección 2:

Esta propuesta introduce dos modificaciones en HTML:

1) Añadir una opción de archivo para el atributo de tipo de entrada.
2) Permita un atributo ACEPTAR para la etiqueta ENTRADA, que es una lista de tipos de medios o patrones de tipo permitidos para la entrada.

Además, se define un nuevo tipo de medio MIME, form-data multipart/, y especifica el comportamiento de los agentes de usuario HTML al interpretar una forma
con ENCTYPE="multipart/form-data" y/o <INPUT type="file">
etiquetas.

Al configurar enctype-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 final de cada "parte".

Eso permite que el navegador para enviar múltiples partes (de ahí el nombre) en una solicitud, e identificar cada uno con sus propios metadatos como el tipo mime, nombre de archivo, etc.

Cuestiones relacionadas