¿Qué significa enctype='multipart/form-data'?
¿Qué significa `enctype='multipart/form-data'en un formulario HTML y cuándo debemos utilizarlo?
1281
3
¿Qué significa `enctype='multipart/form-data'en un formulario HTML y cuándo debemos utilizarlo?
Cuando se hace una petición POST, hay que codificar de alguna manera los datos que forman el cuerpo de la petición.
Los formularios HTML ofrecen tres métodos de codificación.
application/x-www-form-urlencoded
(el predeterminado)Se estaba trabajando en añadir [
application/json
] (http://www.w3.org/TR/html-json-forms/), pero se ha abandonado.(Otras codificaciones son posibles con peticiones HTTP generadas por otros medios que no sean el envío de un formulario HTML).
Los detalles de los formatos no importan a la mayoría de los desarrolladores. Los puntos importantes son:
text/plain
.Cuando escriba código del lado del cliente:
multipart/form-data
cuando su formulario incluya algún elemento<input type="file">
.multipart/form-data
oapplication/x-www-form-urlencoded
, peroapplication/x-www-form-urlencoded
será más eficiente.Cuando esté escribiendo código del lado del servidor:
La mayoría (como
CGI->param
de Perl o la expuesta por el superglobal$_POST
de PHP) se encargará de las diferencias por ti. No se moleste en tratar de analizar la entrada cruda recibida por el servidor.A veces encontrarás una biblioteca que no puede manejar ambos formatos. La librería más popular de Node.js para manejar datos de formularios es body-parser que no puede manejar peticiones multiparte (pero tiene documentación que recomienda algunas alternativas que sí pueden).
Si estás escribiendo (o depurando) una biblioteca para analizar o generar los datos en bruto, entonces tienes que empezar a preocuparte por el formato. También es posible que quieras saberlo por interés.
application/x-www-form-urlencoded
es más o menos lo mismo que una cadena de consulta al final de la URL.El formato
multipart/form-data
es bastante más complicado, pero permite incluir archivos enteros en los datos. Un ejemplo del resultado puede encontrarse en la especificación HTML 4.text/plain
es introducido por HTML 5 y es útil sólo para la depuración - de la especificación: No son interpretables de forma fiable por el ordenador - y yo diría que los otros combinados con herramientas (como la pestaña Net en las herramientas de desarrollo de la mayoría de los navegadores) son mejores para eso).enctype='multipart/form-data
es un tipo de codificación que permite enviar archivos a través de un POST. Simplemente, sin esta codificación los archivos no pueden ser enviados a través de POST.Si quiere permitir que un usuario suba un archivo a través de un formulario, debe utilizar este enctype.
Al enviar un formulario, usted le dice a su navegador que envíe, a través del protocolo HTTP, un mensaje en la red, debidamente envuelto en una estructura de mensajes del protocolo TCP/IP. Una página HTML tiene una forma de enviar datos al servidor: mediante el uso de ``.
Cuando se envía un formulario, se crea una petición HTTP y se envía al servidor, el mensaje contendrá los nombres de los campos del formulario y los valores rellenados por el usuario. Esta transmisión puede ocurrir con los métodos _HTTP
POST
oGET
.POST
le dice al navegador que construya un mensaje HTTP y ponga todo el contenido en el cuerpo del mensaje (una forma muy útil de hacer las cosas, más segura y también flexible).GET
enviará los datos del formulario en la cadena de consulta. Tiene algunas restricciones sobre la representación y la longitud de los datos.Establecer la forma de enviar el formulario al servidor
El atributo
enctype
sólo tiene sentido cuando se utiliza el métodoPOST
. Cuando se especifica, indica al navegador que envíe el formulario codificando su contenido de una manera específica. De MDN - Form enctype:application/x-www-form-urlencoded
: Este es el valor por defecto. Cuando se envía el formulario, se recogen todos los nombres y valores y se realiza la Codificación de URL en la cadena final.multipart/form-data
: Los caracteres NO se codifican. Esto es importante cuando el formulario tiene un control de carga de archivos. Usted quiere enviar el archivo binario y esto asegura que el flujo de bits no sea alterado.text/plain
: Los espacios se convierten, pero no se realiza más codificación.Seguridad
Cuando se envían formularios, pueden surgir algunos problemas de seguridad como se indica en RFC 7578 Sección 7: Datos de formularios multiparte - Consideraciones de seguridad:
Esto le concierne si usted es un desarrollador y su servidor procesará formularios enviados por los usuarios que podrían terminar conteniendo información sensible.