Atributo de entrada 'aceitar' do arquivo - é útil?

338

A implementação de um upload de arquivo sob html é bastante simples, mas notei que existe um atributo 'accept' que pode ser adicionado à <input type="file" ...>tag.

Esse atributo é útil como forma de limitar o upload de arquivos para imagens, etc.? Qual é a melhor maneira de usá-lo?

Como alternativa, existe uma maneira de limitar os tipos de arquivo, de preferência na caixa de diálogo, para uma marca de entrada de arquivo html?

Darren Oster
fonte
11
No que diz respeito a resposta do Li Huan, o link direito de w3school é: w3schools.com/TAGS/att_input_accept.asp
PixEye
11
Eu apenas tentei usar 'accept = application / x-gzip' e funcionou com 'Chrome 19.0.1084.52', mas não faz nada em 'FF 13.0' e 'IE 8.0.6001'.
Jeach
Confira jsfiddle.net/jhfrench/cukjxnp6/embedded/result para obter uma maneira de aprimorar input type="file"a validação de que apenas acceptos tipos de arquivo ed podem ser escolhidos.
Jeromy French

Respostas:

439

O acceptatributo é incrivelmente útil. É uma dica para os navegadores mostrarem apenas os arquivos permitidos para o atual input. Embora normalmente possa ser substituído pelos usuários, ajuda a restringir os resultados para os usuários por padrão, para que eles possam obter exatamente o que estão procurando, sem precisar peneirar centenas de tipos de arquivos diferentes.

Uso

Nota: Esses exemplos foram escritos com base na especificação atual e podem não funcionar de fato em todos (ou quaisquer) navegadores. A especificação também pode mudar no futuro, o que pode quebrar esses exemplos.

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>

Na especificação HTML ( origem )

O acceptatributo pode ser especificado para fornecer aos agentes do usuário uma dica de quais tipos de arquivos serão aceitos.

Se especificado, o atributo deve consistir em um conjunto de tokens separados por vírgula , cada um dos quais deve ser uma correspondência que não diferencia maiúsculas de minúsculas ASCII para um dos seguintes:

A corda audio/*

  • Indica que arquivos de som são aceitos.

A corda video/*

  • Indica que os arquivos de vídeo são aceitos.

A corda image/*

  • Indica que os arquivos de imagem são aceitos.

Um tipo MIME válido sem parâmetros

  • Indica que os arquivos do tipo especificado são aceitos.

Uma sequência cujo primeiro caractere é um caractere U + 002E FULL STOP (.)

  • Indica que arquivos com a extensão de arquivo especificada são aceitos.
0b10011
fonte
71
Eu precisava aceitar arquivos JPG, PNG, GIF, PDF e EPS, mas accept='.jpg,.png,.gif,.pdf,.eps'não permitia nenhuma seleção. Eu tentei muitas variações - espaço delimitado, sem caracteres ponto, etc., mas não dados em v20 Chrome, então acabei usando os tipos MIME e funcionou muito bem:accept='image/jpeg,image/gif,image/png,application/pdf,image/x-eps'
Charlie Schliesser
7
Só consigo que o acima funcione no Chrome. No Firefox 13, não consigo fazer nenhum tipo de arquivo múltiplo funcionar (separado por vírgula ou outro) além de executar um único tipo de curinga image/*. Vadio.
Charlie Schliesser
3
De acordo com as especificações: Value: A set of comma-separated strings, each of which is a valid MIME type, with no parameters.apenas tipos de mímica. Sem extensões. Cabe ao cliente determinar o tipo de mímica.
quer
7
Eu não tenho certeza onde você está recebendo sua informação, mas no I especificação relacionada na resposta, este é listado como perfeitamente válida:A string whose first character is a U+002E FULL STOP character (.) -- Indicates that files with the specified file extension are accepted.
0b10011
4
video/*significa que você não pode carregar mp4 no Safari, você também precisará especificarvideo/mp4
Kit Sunde
88

Sim, é extremamente útil em navegadores que o suportam, mas a "limitação" é uma conveniência para os usuários (para que eles não sejam sobrecarregados com arquivos irrelevantes), e não uma maneira de impedir que eles carreguem coisas que você não deseja. Enviando.

É suportado em

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

Aqui está uma lista dos tipos de conteúdo que você pode usar com ele, seguidos pelas extensões de arquivo correspondentes (embora, é claro, você possa usar qualquer extensão de arquivo):

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
fonte
Não vejo nada para fontes, como application / font-woff ou application / x-font-ttf.
Triynko
@Triynko Eu tenho o mesmo problema, mas vejo que, por exemplo, o Chrome, carrega uma fonte ttf como "application / octet-stream" para que isso não possa ser usado em um elemento de entrada de arquivo ...
estani
Apenas descubra que accept também pode usar sufixos de arquivo! assim accept=".ttf"funciona como esperado.
estani 18/09/19
36

Em 2015, a única maneira que encontrei para fazê-lo funcionar no Chrome e no Firefox é colocar todas as extensões possíveis que você deseja oferecer suporte, incluindo variantes:

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

Problema com o Firefox : Usar o image/jpegtipo MIME O Firefox mostrará apenas .jpgarquivos, muito estranhos como se o comum .jpegnão estivesse ok ...

Faça o que fizer, tente com arquivos com muitas extensões diferentes. Talvez até dependa do sistema operacional ... Acho que não diferencia acceptmaiúsculas de minúsculas, mas talvez não em todos os navegadores.

Aqui estão os documentos MDN sobre Accept :

accept Se o valor do atributo type for file, esse atributo indicará os tipos de arquivos que o servidor aceita, caso contrário, será ignorado. O valor deve ser uma lista separada por vírgula de especificadores de tipo de conteúdo exclusivos:

    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
fonte
11
Essa é a melhor resposta, pois aborda a compatibilidade entre navegadores.
mbomb007
11
Esta resposta é boa. Lembre-se de incluir o caractere "STOP", '.'. Esse foi o meu problema.
Fungusanthrax
35

O atributo Accept foi introduzido no RFC 1867 , com a intenção de habilitar a filtragem de tipo de arquivo com base no tipo MIME para o controle de seleção de arquivo. Mas a partir de 2008, a maioria, se não todos, os navegadores não usam esse atributo. Usando scripts do lado do cliente, você pode fazer uma espécie de validação baseada em extensão, para enviar dados do tipo correto (extensão).

Outras soluções para upload avançado de arquivos requerem filmes em Flash, como SWFUpload, ou Java Applets, como JUpload .

CMS
fonte
5
Segundo a Wikipedia ( en.wikipedia.org/wiki/… ), o Opera parece ser o único navegador que o suporta. É uma grande vergonha, realmente.
Zecc
4
o chrome parece usá-lo. provavelmente encontrou seu caminho em webkit
yincrash
9
"No momento, o atributo de aceitação é suportado apenas pelo Opera 11+, Chrome 16+ e Firefox 9+." De: en.wikipedia.org/wiki/File_select#Accept_attribute_support
Simon
6
O IE 10+ suporta o atributo de aceitação. Foi o último retardatário a não fazê-lo.
Sj26
11
A resposta correta é a mais recente por @bfrohs - tipos MIME: iana.org/assignments/media-types
juanmirocks
24

É suportado pelo Chrome. Não é para ser usado para validação, mas para indicar o sistema operacional. Se você tiver um accept="image/jpeg"atributo em um upload de arquivo, o SO poderá mostrar apenas arquivos do tipo sugerido.

magikMaker
fonte
6
Confirmo que accept="image/*"funciona no Firefox, Chrome e Opera.
Remi.gaubert 27/12/11
11
ele não está funcionando no Safari, eu estou usando o Safari 5.1.7 no Windows
Anand
@MMMMS Você precisa fornecer o tipo MIME, em vez da extensão do arquivo. Use em accept="text/plain"vez disso.
Mbomb007
12

Já se passaram alguns anos, e o Chrome pelo menos faz uso desse atributo. Esse atributo é muito útil do ponto de vista da usabilidade, pois filtra os arquivos desnecessários para o usuário, tornando sua experiência mais suave. No entanto, o usuário ainda pode selecionar "todos os arquivos" do tipo (ou ignorar o filtro); portanto, você sempre deve validar o arquivo onde ele é realmente usado; Se você o estiver usando no servidor, valide-o antes de usá-lo. O usuário sempre pode ignorar qualquer script do lado do cliente.

Kevin Fee
fonte
6

Se o navegador usar esse atributo, ele será apenas uma ajuda para o usuário, portanto ele não fará o upload de um arquivo de vários megabytes apenas para vê-lo rejeitado pelo servidor ... O
mesmo para a <input type="hidden" name="MAX_FILE_SIZE" value="100000">tag: se o navegador o usar, ele não enviará o arquivo, mas um erro resultando em UPLOAD_ERR_FORM_SIZE(2) erro no PHP (não tenho certeza de como ele é tratado em outros idiomas).
Observe que estas são ajuda para o usuário . Obviamente, o servidor sempre deve verificar o tipo e tamanho do arquivo no final: é fácil violar esses valores no lado do cliente.

PhiLho
fonte
0

Em 2008, isso não era importante por causa da falta de sistemas operacionais móveis, mas agora coisa muito importante.

Quando você define tipos de mímica aceitos, por exemplo, no usuário do Android, é exibida uma caixa de diálogo do sistema com aplicativos que podem fornecer a ele o conteúdo de mime que a entrada de arquivo aceita, o que é ótimo porque navegar pelos arquivos no explorador de arquivos em dispositivos móveis é lento e muitas vezes estressante .

Uma coisa importante é que alguns navegadores móveis (baseados na versão Android do Chrome 36 e Chrome Beta 37) não suportam a filtragem de aplicativos por extensões e vários tipos MIME.

KubaBest
fonte