Atributo 'aceptar' de entrada de archivo: ¿es útil?

338

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?

Darren Oster
fuente
1
Con respecto a la respuesta de Li Huan, el enlace correcto a w3school es: w3schools.com/TAGS/att_input_accept.asp
PixEye
1
Acabo de intentar usar 'accept = application / x-gzip' y funcionó con 'Chrome 19.0.1084.52', pero no hace nada en 'FF 13.0' e 'IE 8.0.6001'.
Jeach
Consulte jsfiddle.net/jhfrench/cukjxnp6/embedded/result para ver una forma de mejorar input type="file"y validar que solo acceptse pueden elegir tipos de archivos ed.
Jeromy French

Respuestas:

439

El acceptatributo es increíblemente útil. Es una sugerencia para los navegadores que solo muestren los archivos permitidos para el actual input. 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.

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 ( fuente )

El acceptatributo se puede especificar para proporcionar a los agentes de usuario una pista 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 entre mayúsculas y minúsculas ASCII para uno de los siguientes:

La cuerda audio/*

  • Indica que se aceptan archivos de sonido.

La cuerda video/*

  • Indica que se aceptan archivos de video.

La cuerda image/*

  • Indica que se aceptan archivos de imagen.

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.
0b10011
fuente
71
Necesitaba aceptar archivos JPG, PNG, GIF, PDF y EPS, pero 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'
Charlie Schliesser
77
Solo puedo hacer que lo anterior funcione en Chrome. En Firefox 13 no puedo hacer que funcione ningún tipo de archivo múltiple (separado por comas o de otro modo) aparte de hacer un solo tipo de comodín como image/*. Gorrón.
Charlie Schliesser
3
De acuerdo con la especificació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.
Rudie
77
No estoy seguro de dónde está obteniendo su información, pero en la especificación a la que me A string whose first character is a U+002E FULL STOP character (.) -- Indicates that files with the specified file extension are accepted.
vinculé
44
video/*significa que no puedes subir mp4 en Safari, también tendrás que especificarlovideo/mp4
Kit Sunde
88

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

  • Chrome 16 +
  • Safari 6 +
  • Firefox 9 +
  • IE 10 +
  • Opera 11 +

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

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
iconoclasta
fuente
No veo nada para las fuentes, como application / font-woff o application / x-font-ttf.
Triynko
@Triynko Tengo el mismo problema, pero veo que, por ejemplo, Chrome, carga una fuente ttf como "application / octet-stream", por lo que no se puede usar en un elemento de entrada de archivo ...
estani
¡Solo descubra que aceptar también puede usar sufijos de archivo! Así accept=".ttf"funciona como se esperaba.
estani
36

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:

accept=".jpeg, .jpg, .jpe, .jfif, .jif"

Problema con Firefox : el uso del image/jpegtipo mime Firefox solo mostrará .jpgarchivos, muy extraño como si lo común .jpegno 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 acceptdistingue entre mayúsculas y minúsculas, pero tal vez no en todos los navegadores.

Aquí están los documentos de MDN sobre aceptar :

aceptar Si el valor del atributo type es file, 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
Christophe Roussy
fuente
1
Esta es la mejor respuesta, porque aborda la compatibilidad entre navegadores.
mbomb007
1
Esta respuesta es buena Recuerde incluir el carácter "STOP", '.'. Ese fue mi problema.
fungusanthrax
35

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 .

CMS
fuente
55
Según Wikipedia ( en.wikipedia.org/wiki/… ), Opera parece ser el único navegador que lo admite. Es una gran pena, de verdad.
Zecc
44
Chrome parece usarlo. probablemente encontró su camino en el
kit web
99
"El atributo de aceptación actualmente solo es compatible con Opera 11+, Chrome 16+ y Firefox 9+". De: en.wikipedia.org/wiki/File_select#Accept_attribute_support
Simon
66
IE 10+ admite el atributo accept. Fue el último rezagado que no lo hizo.
sj26
1
La respuesta correcta es la más reciente de @bfrohs - Tipos MIME: iana.org/assignments/media-types
juanmirocks
24

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.

magikMaker
fuente
66
Confirmo que accept="image/*"funciona en Firefox, Chrome y Opera.
remi.gaubert
1
no funciona en Safari, estoy usando Safari 5.1.7 en Windows
Anand
@MMMMS Debe proporcionar el tipo MIME, en lugar de la extensión del archivo. Usar en su accept="text/plain"lugar.
mbomb007
12

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.

Kevin Fee
fuente
6

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 resultado UPLOAD_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.

PhiLho
fuente
0

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.

KubaBest
fuente