Get to know MDN better
Esta página ha sido traducida del inglés por la comunidad. Aprende más y únete a la comunidad de MDN Web Docs.
This feature is well established and works across many devices and browser versions. It’s been available across browsers since julio de 2015.
Los elementos <input> con type="file" permiten al usuario elegir uno o más archivos desde el almacenamiento de su dispositivo. Una vez seleccionados, los archivos pueden ser subidos a un servidor usando el envío de formularios, o manipulados utilizando código JavaScript y la API de archivos (File API).
El atributo value de un input de archivo contiene una cadena que representa la ruta a los archivos seleccionados. Si aún no se ha seleccionado ningún archivo, el valor es una cadena vacía (""). Cuando el usuario selecciona múltiples archivos, el value representa el primer archivo en la lista de archivos seleccionados. Los otros archivos pueden ser identificados utilizando la propiedad HTMLInputElement.files del input.
Nota: El valor es siempre el nombre del archivo con el prefijo C:\fakepath\, que no es la ruta real del archivo. Esto es para prevenir que software malicioso adivine la estructura de archivos del usuario.
Además de los atributos comunes compartidos por todos los elementos <input>, los input de tipo file también soportan los siguientes atributos:
El valor del atributo accept es una cadena que define los tipos de archivos que el input de archivo debería aceptar. Esta cadena es una lista separada por comas de especificadores de tipo de archivo únicos. Debido a que un tipo de archivo dado puede ser identificado de más de una manera, es útil proporcionar un conjunto completo de especificadores de tipo cuando necesitas archivos de un formato dado.
Por ejemplo, hay varias maneras de identificar archivos de Microsoft Word, por lo que un sitio que acepte archivos de Word podría usar un <input> como este:
El valor del atributo capture es una cadena que especifica qué cámara utilizar para capturar datos de imagen o video, si el atributo accept indica que el input debe ser de uno de esos tipos. Un valor de user indica que se debe usar la cámara y/o micrófono orientados hacia el usuario. Un valor de environment especifica que se debe usar la cámara y/o micrófono orientados hacia el entorno. Si este atributo falta, el agente de usuario es libre de decidir por sí mismo qué hacer. Si el modo de orientación solicitado no está disponible, el agente de usuario puede volver a su modo predeterminado preferido.
Nota:>capture era anteriormente un atributo booleano que, si estaba presente, solicitaba que se usará el dispositivo de captura de medios del dispositivo (como la cámara o el micrófono) en lugar de solicitar una entrada de archivo.
Cuando se especifica el atributo booleano multiple, el input de archivo permite al usuario seleccionar más de un archivo.
Además de los atributos listados anteriormente, los siguientes atributos no estándar están disponibles en algunos navegadores. Deberías intentar evitar usarlos cuando sea posible, ya que hacerlo limitará la capacidad de tu código para funcionar en navegadores que no los implementan.
El atributo booleano webkitdirectory, si está presente, indica que solo los directorios deberían estar disponibles para ser seleccionados por el usuario en la interfaz del selector de archivos. Consulta HTMLInputElement.webkitdirectory para detalles adicionales y ejemplos.
Aunque originalmente implementado sólo para navegadores basados en WebKit, webkitdirectory también se puede usar en Microsoft Edge, así como en Firefox 50 y posteriores. Sin embargo, aunque tiene un soporte relativamente amplio, aún no es estándar y no debería usarse a menos que no tengas alternativa.
Un especificador de tipo de archivo único es una cadena que describe un tipo de archivo que puede ser seleccionado por el usuario en un elemento <input> de tipo file. Cada especificador de tipo de archivo único puede tomar una de las siguientes formas:
El atributo accept toma una cadena que contiene uno o más de estos especificadores de tipo de archivo únicos como su valor, separados por comas. Por ejemplo, un selector de archivos que necesita contenido que puede presentarse como una imagen, incluyendo tanto formatos de imagen estándar como archivos PDF, podría verse así:
Esto produce el siguiente resultado:
Nota: Puedes encontrar este ejemplo en GitHub también: ver el código fuente, y también verlo funcionando en vivo.
Independientemente del dispositivo o sistema operativo del usuario, el input de archivo proporciona un botón que abre un cuadro de diálogo del selector de archivos que permite al usuario elegir un archivo.
Incluir el atributo multiple, como se muestra arriba, especifica que se pueden elegir múltiples archivos a la vez. El usuario puede elegir múltiples archivos desde el selector de archivos de cualquier manera que su plataforma elegida permita (por ejemplo, manteniendo presionada la tecla Shift o Control y luego haciendo clic). Si solo quieres que el usuario elija un solo archivo por <input>, omite el atributo multiple.
Los archivos seleccionados son devueltos por la propiedad HTMLInputElement.files del elemento, que es un objeto FileList que contiene una lista de objetos File. El FileList se comporta como un arreglo, por lo que puedes verificar su propiedad length para obtener el número de archivos seleccionados.
Cada objeto File contiene la siguiente información:
nameEl nombre del archivo.
lastModifiedUn número que especifica la fecha y hora en que el archivo fue modificado por última vez, en milisegundos desde la época UNIX (1 de enero de 1970, a medianoche).
lastModifiedDateUn objeto Date que representa la fecha y hora en que el archivo fue modificado por última vez. Esto está obsoleto y no debería usarse. Usa lastModified en su lugar.
sizeEl tamaño del archivo en bytes.
typeEl tipo MIME del archivo.
webkitRelativePathUna cadena que especifica la ruta del archivo relativa al directorio base seleccionado en un selector de directorios (es decir, un input de tipo file en el que se establece el atributo webkitdirectory). Esto no es estándar y debe usarse con precaución.
Nota: Puedes establecer así como obtener el valor de HTMLInputElement.files en todos los navegadores modernos; esto se agregó más recientemente a Firefox, en la versión 57 (ver el error 1384030 de Firefox).
A menudo no querrás que el usuario pueda seleccionar cualquier tipo de archivo arbitrario; en su lugar, a menudo quieres que seleccionen archivos de un tipo o tipos específicos. Por ejemplo, si tu entrada de archivo permite a los usuarios subir una foto de perfil, probablemente querrás que seleccionen formatos de imagen compatibles con la web, como JPEG o PNG.
Los tipos de archivo aceptables se pueden especificar con el atributo accept, que toma una lista separada por comas de extensiones de archivo permitidas o tipos MIME. Algunos ejemplos:
Veamos un ejemplo más completo:
Esto produce un resultado similar al ejemplo anterior:
Nota: Puedes encontrar este ejemplo en GitHub también: ver el código fuente, y también verlo funcionando en vivo.
Puede parecer similar, pero si intentas seleccionar un archivo con este input, verás que el selector de archivos solo te permite seleccionar los tipos de archivo especificados en el valor accept (la interfaz exacta difiere entre navegadores y sistemas operativos).
El atributo accept no valida los tipos de archivos seleccionados, sino que proporciona sugerencias a los navegadores para guiar a los usuarios hacia la selección de los tipos de archivos correctos. Aún es posible (en la mayoría de los casos) que los usuarios activen una opción en el selector de archivos que les permita anular esto y seleccionar cualquier archivo que deseen, y luego elegir los tipos de archivos incorrectos.
Debido a esto, debes asegurarte de que el atributo accept esté respaldado por una validación adecuada del lado del servidor.
El evento cancel se activa cuando el usuario no cambia su selección, volviendo a seleccionar los archivos previamente seleccionados. El evento cancel también se activa cuando el cuadro de diálogo del selector de archivos se cierra o se cancela mediante el botón "cancelar" o la tecla de escape.
Por ejemplo, el siguiente código registrará en la consola si el usuario cierra el cuadro de diálogo sin seleccionar un archivo:
No puedes establecer el valor de un selector de archivos desde un script: hacer algo como lo siguiente no tiene ningún efecto:
Cuando se elige un archivo usando un <input type="file">, la ruta real al archivo fuente no se muestra en el atributo value del input por razones obvias de seguridad. En su lugar, se muestra el nombre del archivo, con C:\fakepath\ como prefijo. Hay algunas razones históricas para esta peculiaridad, pero está soportada en todos los navegadores modernos y, de hecho, está definida en la especificación.
En este ejemplo, presentaremos un selector de archivos ligeramente más avanzado que aprovecha la información del archivo disponible en la propiedad HTMLInputElement.files, además de mostrar algunos trucos ingeniosos.
Nota: Puedes ver el código fuente completo para este ejemplo en GitHub: file-example.html (véalo en vivo también). No explicaremos el CSS; el JavaScript es el enfoque principal.
Primero, veamos el HTML:
Esto es similar a lo que hemos visto antes: nada especial que comentar.
A continuación, vamos a recorrer el JavaScript.
En las primeras líneas del script, obtenemos referencias al input del formulario y al elemento <div> con la clase .preview. Luego, ocultamos el elemento <input>; hacemos esto porque los inputs de archivos tienden a ser feos, difíciles de estilizar e inconsistentes en su diseño a través de los navegadores. Puedes activar el elemento input haciendo clic en su etiqueta, por lo que es mejor ocultar visualmente el input y estilizar la etiqueta como un botón, para que el usuario sepa que debe interactuar con ella si quiere subir archivos.
Nota: Se usa opacity para ocultar el input de archivo en lugar de visibility: hidden o display: none, porque la tecnología asistiva interpreta los dos últimos estilos como si el input no fuera interactivo.
A continuación, añadimos un detector de eventos al input para detectar cambios en su valor seleccionado (en este caso, cuando se seleccionan archivos). El detector de eventos invoca nuestra función personalizada updateImageDisplay().
Cada vez que se invoca la función updateImageDisplay(), nosotros:
Usamos un bucle while para vaciar el contenido anterior del <div> de previsualización.
Obtenemos el objeto FileList que contiene la información sobre todos los archivos seleccionados y lo almacenamos en una variable llamada curFiles.
Comprobamos si no se seleccionaron archivos, verificando si curFiles.length es igual a 0. Si es así, imprimimos un mensaje en el <div> de previsualización indicando que no se han seleccionado archivos.
Si se han seleccionado archivos, iteramos a través de cada uno, imprimiendo información sobre él en el <div> de previsualización. Cosas a notar aquí:
Usamos la función personalizada validFileType() para verificar si el archivo es del tipo correcto (por ejemplo, los tipos de imagen especificados en el atributo accept).
Si lo es, nosotros:
Si el tipo de archivo es inválido, mostramos un mensaje dentro de un elemento de lista diciendo al usuario que necesita seleccionar un tipo de archivo diferente.
La función personalizada validFileType() toma un objeto File como parámetro, luego usa Array.prototype.includes() para verificar si algún valor en fileTypes coincide con la propiedad type del archivo. Si se encuentra una coincidencia, la función devuelve true. Si no se encuentra ninguna coincidencia, devuelve false.
La función returnFileSize() toma un número (de bytes, tomado de la propiedad size del archivo actual), y lo convierte en un tamaño bien formateado en bytes/KB/MB.
Nota: Las unidades "KB" y "MB" utilizan aquí la convención de prefijo SI de 1 KB = 1000 B, similar a macOS. Los distintos sistemas representan los tamaños de archivo de forma diferente: por ejemplo, Ubuntu utiliza prefijos IEC donde 1 KiB = 1024 B, mientras que las especificaciones de RAM suelen utilizar prefijos SI para representar potencias de dos (1 KB = 1024 B). Por este motivo, utilizamos 1e3 (1000) y 1e6 (100000) en lugar de 1024 y 1048576. En su aplicación, debe comunicar el sistema de unidades claramente a sus usuarios si el tamaño exacto es importante.
El ejemplo se ve así; juegue:
| Valor | Una cadena que representa la ruta al archivo seleccionado. |
| Eventos | change, input y cancel |
| Atributos comunes soportados | required |
| Atributos adicionales | accept, capture, multiple |
| Atributos IDL | files y value |
| Interfaz DOM | HTMLInputElement |
| Métodos | select() |
| Rol ARIA implícito | ningún rol correspondiente |
| HTML # file-upload-state-(type=file) |
Enable JavaScript to view this browser compatibility table.
This page was last modified on 10 abr 2026 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.