La etiqueta <input> con ficheros

Controles: Envío de archivos


Una de las características más interesantes de un formulario, es la posibilidad de enviar archivos por parte de un usuario a través de un formulario. Mediante la etiqueta <input type="file"> es posible seleccionar archivos, adjuntarlos y enviarlos junto al resto del formulario.

Esta interfaz habitualmente se muestra como un botón «Examinar...» o «Seleccionar archivo», mediante el cuál nos abrirá una ventana de diálogo del sistema operativo que nos permitirá seleccionar el archivo de las carpetas de nuestro equipo o dispositivo.

Tipo de información a obtenerEtiqueta a utilizarEjemplo
Adjuntar archivo<input type="file">

Activar envío de archivos

Si utilizamos un campo de envío de archivos en un formulario, debemos tener claro el atributo enctype de la etiqueta <form> contenedora, ya que es un punto importante en este tema. Este atributo indica el tipo de contenido que se va a enviar en el formulario, y puede tener varios valores:

Tipo de codificaciónDescripción
application/x-www-form-urlencodedValor por defecto. Es el que se utiliza normalmente.
multipart/form-dataPermite enviar archivos mediante campos <input type="file">.
text/plainSólo se envía texto plano. No se suele utilizar hoy en día.

Si omitimos el atributo de la etiqueta <form> o ponemos un valor incorrecto, asumirá el primero. Sin embargo, si queremos enviar archivos debemos asegurarnos de tener el valor multipart/form-data:

<form method="post" action="/send/" enctype="multipart/form-data">
  <input type="file">
</form>

Ya estamos listos para enviar un fichero. Ahora vamos a profundizar en los atributos de la etiqueta <input>.

Sugerencias de archivos

Es posible indicar el atributo accept a la etiqueta <input type="file"> a modo de sugerencia para el navegador, de modo que podamos indicar los formatos de archivos permitidos subir al formulario.

Veamos un ejemplo, utilizando este atributo:

<form method="post" action="/send/" enctype="multipart/form-data">
  Selecciona una foto para enviar:
  <input type="file" accept="image/jpeg">
</form>

En el interior del atributo accept tenemos lo que se denomina un tipo MIME, una especie de fragmento de texto que identifica de forma única el formato de archivo. Algunas de las más interesantes para utilizar hoy en día en un formulario serían las siguientes:

Tipo MIMEDescripción
Imágenes
image/jpegImágenes JPEG.
image/pngImágenes PNG.
image/gifImágenes animadas GIF.
image/apngImágenes PNG animadas.
image/svg+xmlImágenes vectoriales SVG.
image/webpImágenes de WEBP.
image/avifImágenes de nueva generación AVIF.
image/jxlImágenes de nueva generación JPEG-XL.
image/*Cualquier tipo de imagen.
Audio
audio/mpegAudio MP3.
audio/oggAudio OGG.
audio/aacAudio AAC.
audio/opusAudio Opus.
audio/*Cualquier tipo de audio.
Vídeo
video/oggVideo OGG Vorbis.
video/mp4Video MP4.
video/webmVideo WebMovie.
video/*Cualquier tipo de video.
Otros
application/pdfDocumentos PDF.
application/zipArchivos comprimidos ZIP.
application/vnd.rarArchivos comprimidos RAR.
application/x-7z-compressedArchivos comprimidos 7Z.

Es importante saber que esto es sólo una sugerencia, el usuario puede subir otro tipo de archivos de forma malintencionada o no intencionada, por lo que al margen de esto, siempre debería comprobarse y revisarse en el backend.

Seleccionar múltiples archivos

Por otro lado, si indicamos el atributo multiple en la etiqueta <input type="file">, estaremos dando la opción al usuario de poder enviar múltiples archivos en lugar de uno en el mismo campo:

<form method="post" action="/send/" enctype="multipart/form-data">
  Selecciona varias fotos para enviar:
  <input type="file" accept="image/jpeg" multiple>
</form>

Como siempre, nos aparecerá el diálogo de selección de archivos, sólo que en esta ocasión el usuario podrá pulsar la tecla CTRL, y seleccionar varios archivos a la vez, en lugar de uno solo.

En general, esta característica no suele verse mucho en el mundo real, y lo que se suele hacer es añadir múltiples campos de envío de fichero, uno por cada fichero que quieres enviar. Luego, esto se procesa en el lado del servidor por cada uno de ellos.

Recuerda que esto que hemos visto es sólo la habilitación de controles para que el usuario pueda adjuntar y enviar ficheros a través de un formulario, sin embargo, el proceso de obtenerlos y tratarlos se hace en el lado del servidor.

¿Quién soy yo?

Soy Manz, vivo en Tenerife (España) y soy streamer partner en Twitch y profesor. Me apasiona el universo de la programación web, el diseño y desarrollo web y la tecnología en general. Aunque soy full-stack, mi pasión es el front-end, la terminal y crear cosas divertidas y locas.

Puedes encontrar más sobre mi en Manz.dev