¿Por qué se requiere <form enctype=multipart/form-data>
al cargar un archivo a un servidor web?¿Por qué se requiere form enctype = multipart/form-data al cargar un archivo?
Respuesta
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.
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
conENCTYPE="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.
- 1. ¿Por qué cargar este archivo requiere tanta memoria?
- 2. Drupal: ¿Se requiere subir un archivo?
- 3. ¿Cómo obtener un archivo completo al cargar archivos en PHP?
- 4. ¿Por qué se requiere un vector?
- 5. $ _FILES vacía al cargar
- 6. ¿Puede un servlet determinar si los datos publicados en él son enctype = "multipart/form-data"?
- 7. ¿Por qué se requiere copy_to/from_user?
- 8. dojo.io.iframe error al cargar un archivo
- 9. ¿Por qué se requiere $ root aquí?
- 10. .Net multipart/form-data forma enctype y UTF-8 caracteres "especiales" => (MVC w/HttpPostedFileBase)
- 11. ¿Por qué Scanf requiere &?
- 12. ERR_CONNECTION_RESET: la conexión se restableció al cargar un archivo grande
- 13. ¿Por qué esta consulta requiere un parámetro?
- 14. ¿Forma con enctype = "multipart/form-data" causan problemas para acceder a un campo oculto
- 15. Se requiere Oracle sqlldr TRAILING NULLCOLS, pero ¿por qué?
- 16. ¿Por qué WPF requiere que se aplique un atributo STAThread al método Main?
- 17. Windows Form Designer: No se pudo cargar el archivo o el ensamblado
- 18. App-Engine (Java) Archivo de datos Cargar
- 19. ¿Por qué PreparedStatement.setNull requiere sqlType?
- 20. Ruby - requiere 'watir-webdriver' - genera un LoadError sin dicho archivo ... ¿Por qué?
- 21. ¿Por qué se requiere sid en 'KILL SESSION' (Oracle SQL)?
- 22. ¿Por qué log4net 1.2.10 requiere System.Web?
- 23. ¿Por qué ofstream requiere una descarga?
- 24. Problema al cargar un archivo de biblioteca DLL ... java.lang.UnsatisfiedLinkError: No se puede cargar la biblioteca
- 25. ¿Por qué se requiere el paquete redistribuible de Visual C++?
- 26. ¿Por qué un Fortran POINTER requiere un OBJETIVO?
- 27. por qué tomcat no requiere reiniciar cuando se cambia jsp
- 28. IE9 arroja excepciones al cargar scripts en iframe. ¿Por qué?
- 29. method = "post" enctype = "text/plain" no son compatibles?
- 30. ¿Por qué # se requiere antes #include <stdio.h>?
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? –