¿Qué significa enctype='multipart/form-data'?

¿Qué significa `enctype='multipart/form-data'en un formulario HTML y cuándo debemos utilizarlo?

Solución

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)
  • Multipart/form-data
  • "text/plain".

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:

  • No utilizar nunca text/plain.

Cuando escriba código del lado del cliente:

  • utilice multipart/form-data cuando su formulario incluya algún elemento <input type="file">.
  • De lo contrario, puede utilizar multipart/form-data o application/x-www-form-urlencoded, pero application/x-www-form-urlencoded será más eficiente.

Cuando esté escribiendo código del lado del servidor:

  • Utilice una biblioteca de manejo de formularios preescrita

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

Comentarios (5)

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.

Comentarios (5)

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 o GET.

  • 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étodo POST. Cuando se especifica, indica al navegador que envíe el formulario codificando su contenido de una manera específica. De MDN - Form enctype:

Cuando el valor del atributo method es post, enctype es el tipo MIME que se utiliza para enviar el formulario al servidor.

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

Todo el software de procesamiento de formularios debe tratar los datos de formulario suministrados por el usuario datos de formularios suministrados por el usuario, ya que a menudo contienen información personal. Está muy extendido el uso de funciones de "autocompletado" de formularios en los navegadores web. de formularios en los navegadores web, que pueden utilizarse para engañar a los usuarios para que envíen, sin saberlo, información confidencial al cumplimentar los formularios. que, sin saberlo, envíen información confidencial al completar tareas que, de otro modo, serían inocuas. de otro modo inocuos. multipart/form-data no proporciona ninguna característica para comprobar la integridad, asegurar la confidencialidad, evitar la confusión del usuario confusión del usuario, u otras características de seguridad. Estas preocupaciones deben ser abordadas por las aplicaciones de llenado e interpretación de datos de formularios.

Las aplicaciones que reciben formularios y los procesan deben tener cuidado de no devolver datos al sitio de procesamiento de formularios que los solicita que no estaba previsto enviar.

Es importante que cuando se interprete el nombre de archivo del campo de cabecera Content- campo de cabecera de la disposición para no sobrescribir inadvertidamente archivos en el espacio de archivos del destinatario.

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.

Comentarios (1)