html - seleccionar - que significa alt en una imagen
Entrada de archivo ''aceptar'' atributo-¿es útil? (8)
Implementar una carga de archivos en html es bastante simple, pero me di cuenta de que hay un atributo ''aceptar'' que se puede agregar a la etiqueta <input type="file" ...>
.
¿Es este atributo útil como una forma de limitar las cargas de archivos a imágenes, etc.? ¿Cuál es la mejor manera de usarlo?
Alternativamente, ¿hay una manera de limitar los tipos de archivos, preferiblemente en el diálogo de archivo, para una etiqueta de entrada de archivo html?
El atributo de accept
es increíblemente útil. Es una sugerencia para los navegadores mostrar solo los archivos permitidos para la input
actual. Si bien los usuarios generalmente 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 en función de la especificación actual y es posible que no funcionen en todos los navegadores (o en ninguno). La especificación también puede cambiar en el futuro, lo que podría romper estos ejemplos.
h1 { font-size: 1em; margin:1em 0; }
h1 ~ h1 { border-top: 1px solid #ccc; padding-top: 1em; }
<h1>Match all image files (image/*)</h1>
<p><label>image/* <input type="file" accept="image/*"></label></p>
<h1>Match all video files (video/*)</h1>
<p><label>video/* <input type="file" accept="video/*"></label></p>
<h1>Match all audio files (audio/*)</h1>
<p><label>audio/* <input type="file" accept="audio/*"></label></p>
<h1>Match all image files (image/*) and files with the extension ".someext"</h1>
<p><label>.someext,image/* <input type="file" accept=".someext,image/*"></label></p>
<h1>Match all image files (image/*) and video files (video/*)</h1>
<p><label>image/*,video/* <input type="file" accept="image/*,video/*"></label></p>
De la especificación HTML ( source )
El atributo de
accept
puede especificarse para proporcionar a los agentes de usuario una sugerencia de qué tipos de archivos se aceptarán.Si se especifica, el atributo debe consistir en un conjunto de tokens separados por comas , cada uno de los cuales debe ser una coincidencia ASCII entre mayúsculas y minúsculas para uno de los siguientes:
La cadena de
audio/*
- Indica que los archivos de sonido son aceptados.
La cadena de
video/*
- Indica que los archivos de video son aceptados.
La
image/*
cadenaimage/*
- Indica que los archivos de imagen son aceptados.
Un tipo MIME válido sin parámetros
- Indica que se aceptan archivos del tipo especificado.
Una cadena cuyo primer carácter es un carácter U + 002E FULL STOP (.)
- Indica que se aceptan archivos con la extensión de archivo especificada.
El atributo de aceptación 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. Usando scripts del lado del cliente, puede hacer una especie de validación basada en extensión, 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 .
En 2008, esto no era importante debido a la falta de sistemas operativos móviles, pero ahora es algo muy importante.
Cuando configura los tipos de mimo aceptados, entonces, por ejemplo, al usuario de Android se le proporciona un diálogo del sistema con aplicaciones que pueden proporcionarle el contenido de mime que acepta la entrada de archivos, lo que es excelente porque navegar por 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 son compatibles con el filtrado de aplicaciones sobre extensiones y múltiples tipos de mimos.
En 2015, la única forma que encontré para hacer que funcione tanto para Chrome como para Firefox es poner todas las extensiones posibles que desee admitir, incluidas las variantes:
accept=".jpeg, .jpg, .jpe, .jfif, .jif"
Problema con FireFox : el uso del tipo de image/jpeg
mime FireFox solo mostrará archivos .jpg
, muy extraño como si el .jpeg
común 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 accept
distingue mayúsculas de minúsculas, pero quizás no en todos los navegadores.
Aquí está la documentación de MDN sobre aceptar :
aceptar Si el valor del atributo de tipo es archivo, este atributo indicará los tipos de archivos que acepta el servidor, de lo contrario se ignorará. El valor debe ser una lista separada por comas de especificadores de tipo de contenido únicos:
A file extension starting with the STOP character (U+002E). (e.g. .jpg, .png, .doc). A valid MIME type with no extensions. audio/* representing sound files. HTML5 video/* representing video files. HTML5 image/* representing image files. HTML5
Es compatible con Chrome. No se supone que se use para la validación, sino para indicar el sistema operativo. Si tiene un atributo accept="image/jpeg"
en la carga de un archivo, el sistema operativo solo puede mostrar los archivos del tipo sugerido.
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 suave. 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 usa; Si lo está utilizando en el servidor, valídelo allí antes de usarlo. El usuario siempre puede omitir cualquier script del lado del cliente.
Sí, es extremadamente útil en los navegadores que lo admiten, pero la "limitación" es como 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 soportado en
- Chrome 16 +
- Safari 6 +
- Firefox 9 +
- IE 10 +
- Opera 11 +
Aquí hay una lista de tipos de contenido que puede usar con ella, seguidos de las extensiones de archivo correspondientes (aunque, por supuesto, puede usar cualquier extensión de archivo):
application/envoy evy
application/fractals fif
application/futuresplash spl
application/hta hta
application/internet-property-stream acx
application/mac-binhex40 hqx
application/msword doc
application/msword dot
application/octet-stream *
application/octet-stream bin
application/octet-stream class
application/octet-stream dms
application/octet-stream exe
application/octet-stream lha
application/octet-stream lzh
application/oda oda
application/olescript axs
application/pdf pdf
application/pics-rules prf
application/pkcs10 p10
application/pkix-crl crl
application/postscript ai
application/postscript eps
application/postscript ps
application/rtf rtf
application/set-payment-initiation setpay
application/set-registration-initiation setreg
application/vnd.ms-excel xla
application/vnd.ms-excel xlc
application/vnd.ms-excel xlm
application/vnd.ms-excel xls
application/vnd.ms-excel xlt
application/vnd.ms-excel xlw
application/vnd.ms-outlook msg
application/vnd.ms-pkicertstore sst
application/vnd.ms-pkiseccat cat
application/vnd.ms-pkistl stl
application/vnd.ms-powerpoint pot
application/vnd.ms-powerpoint pps
application/vnd.ms-powerpoint ppt
application/vnd.ms-project mpp
application/vnd.ms-works wcm
application/vnd.ms-works wdb
application/vnd.ms-works wks
application/vnd.ms-works wps
application/winhlp hlp
application/x-bcpio bcpio
application/x-cdf cdf
application/x-compress z
application/x-compressed tgz
application/x-cpio cpio
application/x-csh csh
application/x-director dcr
application/x-director dir
application/x-director dxr
application/x-dvi dvi
application/x-gtar gtar
application/x-gzip gz
application/x-hdf hdf
application/x-internet-signup ins
application/x-internet-signup isp
application/x-iphone iii
application/x-javascript js
application/x-latex latex
application/x-msaccess mdb
application/x-mscardfile crd
application/x-msclip clp
application/x-msdownload dll
application/x-msmediaview m13
application/x-msmediaview m14
application/x-msmediaview mvb
application/x-msmetafile wmf
application/x-msmoney mny
application/x-mspublisher pub
application/x-msschedule scd
application/x-msterminal trm
application/x-mswrite wri
application/x-netcdf cdf
application/x-netcdf nc
application/x-perfmon pma
application/x-perfmon pmc
application/x-perfmon pml
application/x-perfmon pmr
application/x-perfmon pmw
application/x-pkcs12 p12
application/x-pkcs12 pfx
application/x-pkcs7-certificates p7b
application/x-pkcs7-certificates spc
application/x-pkcs7-certreqresp p7r
application/x-pkcs7-mime p7c
application/x-pkcs7-mime p7m
application/x-pkcs7-signature p7s
application/x-sh sh
application/x-shar shar
application/x-shockwave-flash swf
application/x-stuffit sit
application/x-sv4cpio sv4cpio
application/x-sv4crc sv4crc
application/x-tar tar
application/x-tcl tcl
application/x-tex tex
application/x-texinfo texi
application/x-texinfo texinfo
application/x-troff roff
application/x-troff t
application/x-troff tr
application/x-troff-man man
application/x-troff-me me
application/x-troff-ms ms
application/x-ustar ustar
application/x-wais-source src
application/x-x509-ca-cert cer
application/x-x509-ca-cert crt
application/x-x509-ca-cert der
application/ynd.ms-pkipko pko
application/zip zip
audio/basic au
audio/basic snd
audio/mid mid
audio/mid rmi
audio/mpeg mp3
audio/x-aiff aif
audio/x-aiff aifc
audio/x-aiff aiff
audio/x-mpegurl m3u
audio/x-pn-realaudio ra
audio/x-pn-realaudio ram
audio/x-wav wav
image/bmp bmp
image/cis-cod cod
image/gif gif
image/ief ief
image/jpeg jpe
image/jpeg jpeg
image/jpeg jpg
image/pipeg jfif
image/svg+xml svg
image/tiff tif
image/tiff tiff
image/x-cmu-raster ras
image/x-cmx cmx
image/x-icon ico
image/x-portable-anymap pnm
image/x-portable-bitmap pbm
image/x-portable-graymap pgm
image/x-portable-pixmap ppm
image/x-rgb rgb
image/x-xbitmap xbm
image/x-xpixmap xpm
image/x-xwindowdump xwd
message/rfc822 mht
message/rfc822 mhtml
message/rfc822 nws
text/css css
text/h323 323
text/html htm
text/html html
text/html stm
text/iuls uls
text/plain bas
text/plain c
text/plain h
text/plain txt
text/richtext rtx
text/scriptlet sct
text/tab-separated-values tsv
text/webviewhtml htt
text/x-component htc
text/x-setext etx
text/x-vcard vcf
video/mpeg mp2
video/mpeg mpa
video/mpeg mpe
video/mpeg mpeg
video/mpeg mpg
video/mpeg mpv2
video/quicktime mov
video/quicktime qt
video/x-la-asf lsf
video/x-la-asf lsx
video/x-ms-asf asf
video/x-ms-asf asr
video/x-ms-asf asx
video/x-msvideo avi
video/x-sgi-movie movie
x-world/x-vrml flr
x-world/x-vrml vrml
x-world/x-vrml wrl
x-world/x-vrml wrz
x-world/x-vrml xaf
x-world/x-vrml xof
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 etiqueta <input type="hidden" name="MAX_FILE_SIZE" value="100000">
: si el navegador lo usa, no enviará el archivo, pero se generará un error UPLOAD_ERR_FORM_SIZE
(2) en PHP (no seguro como 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 tamaño del archivo en su extremo: es fácil manipular estos valores en el lado del cliente.