Implementar una carga de archivos en html es bastante simple, pero acabo de notar que hay un atributo 'aceptar' que se puede agregar a la <input type="file" ...>
etiqueta.
¿Es útil este atributo como una forma de limitar la carga de archivos a imágenes, etc.? ¿Cuál es la mejor manera de usarlo?
Alternativamente, ¿hay alguna forma de limitar los tipos de archivos, preferiblemente en el diálogo de archivo, para una etiqueta de entrada de archivo html?
html
filter
cross-browser
mime-types
Darren Oster
fuente
fuente
input type="file"
y validar que soloaccept
se pueden elegir tipos de archivos ed.Respuestas:
El
accept
atributo es increíblemente útil. Es una sugerencia para los navegadores que solo muestren los archivos permitidos para el actualinput
. Si bien, por lo general, los usuarios pueden anularlo, ayuda a reducir los resultados para los usuarios de manera predeterminada, para que puedan obtener exactamente lo que están buscando sin tener que examinar cientos de tipos de archivos diferentes.Uso
Nota: Estos ejemplos se escribieron según la especificación actual y es posible que no funcionen en todos (o en ninguno) los navegadores. La especificación también puede cambiar en el futuro, lo que podría romper estos ejemplos.
De la especificación HTML ( fuente )
fuente
accept='.jpg,.png,.gif,.pdf,.eps'
no permití ninguna selección. Intenté muchas variaciones: delimitado por espacios, sin caracteres de puntos, etc., pero sin dados en Chrome v20, así que terminé usando los tipos mime y funcionó muy bien:accept='image/jpeg,image/gif,image/png,application/pdf,image/x-eps'
image/*
. Gorrón.Value: A set of comma-separated strings, each of which is a valid MIME type, with no parameters.
solo tipos de mimo. Sin extensiones Depende del cliente determinar el tipo de mime.A string whose first character is a U+002E FULL STOP character (.) -- Indicates that files with the specified file extension are accepted.
video/*
significa que no puedes subir mp4 en Safari, también tendrás que especificarlovideo/mp4
Sí, es extremadamente útil en los navegadores que lo admiten, pero la "limitación" es una conveniencia para los usuarios (por lo que no están abrumados con archivos irrelevantes) en lugar de una forma de evitar que carguen cosas que no desea. subiendo
Es compatible con
Aquí hay una lista de tipos de contenido que puede usar con ella, seguida de las extensiones de archivo correspondientes (aunque, por supuesto, puede usar cualquier extensión de archivo):
fuente
accept=".ttf"
funciona como se esperaba.En 2015, la única forma en que encontré que funciona tanto para Chrome como para Firefox es poner todas las extensiones posibles que desea admitir, incluidas las variantes:
Problema con Firefox : el uso del
image/jpeg
tipo mime Firefox solo mostrará.jpg
archivos, muy extraño como si lo común.jpeg
no estuviera bien ...Hagas lo que hagas, asegúrate de probar con archivos que tengan muchas extensiones diferentes. Tal vez incluso depende del sistema operativo ... supongo que no
accept
distingue entre mayúsculas y minúsculas, pero tal vez no en todos los navegadores.Aquí están los documentos de MDN sobre aceptar :
fuente
El atributo Aceptar se introdujo en el RFC 1867 , con la intención de habilitar el filtrado de tipo de archivo basado en el tipo MIME para el control de selección de archivo. Pero a partir de 2008, la mayoría, si no todos, los navegadores no hacen uso de este atributo. Mediante el uso de secuencias de comandos del lado del cliente, puede realizar una especie de validación basada en extensiones para enviar datos del tipo correcto (extensión).
Otras soluciones para la carga avanzada de archivos requieren películas Flash como SWFUpload o Java Applets como JUpload .
fuente
Es compatible con Chrome. No se supone que se use para la validación, sino para insinuar el sistema operativo. Si tiene un
accept="image/jpeg"
atributo en un archivo cargado, el sistema operativo solo puede mostrar archivos del tipo sugerido.fuente
accept="image/*"
funciona en Firefox, Chrome y Opera.accept="text/plain"
lugar.Han pasado algunos años, y Chrome al menos hace uso de este atributo. Este atributo es muy útil desde el punto de vista de la usabilidad, ya que filtrará los archivos innecesarios para el usuario, haciendo que su experiencia sea más fluida. Sin embargo, el usuario aún puede seleccionar "todos los archivos" del tipo (o de lo contrario omitir el filtro), por lo tanto, siempre debe validar el archivo donde realmente se utiliza; Si lo está usando en el servidor, valídelo allí antes de usarlo. El usuario siempre puede omitir cualquier script del lado del cliente.
fuente
Si el navegador usa este atributo, es solo como una ayuda para el usuario, por lo que no cargará un archivo de varios megabytes solo para verlo rechazado por el servidor ...
Lo mismo para la
<input type="hidden" name="MAX_FILE_SIZE" value="100000">
etiqueta: si el navegador lo usa, no enviará el archivo sino un error que dará como resultadoUPLOAD_ERR_FORM_SIZE
(2) un error en PHP (no estoy seguro de cómo se maneja en otros idiomas).Tenga en cuenta que estas son ayudas para el usuario . Por supuesto, el servidor siempre debe verificar el tipo y el tamaño del archivo en su extremo: es fácil alterar estos valores en el lado del cliente.
fuente
En 2008, esto no era importante debido a la falta de sistemas operativos móviles, pero ahora es algo bastante importante.
Cuando configura los tipos de MIME aceptados, entonces, por ejemplo, el usuario de Android recibe un diálogo del sistema con aplicaciones que pueden proporcionarle el contenido de MIME que la entrada de archivos acepta, lo que es genial porque navegar a través de los archivos en el explorador de archivos en dispositivos móviles es lento y a menudo estresante .
Una cosa importante es que algunos navegadores móviles (basados en la versión de Android de Chrome 36 y Chrome Beta 37) no admiten el filtrado de aplicaciones sobre extensiones y múltiples tipos de MIME.
fuente