Attributo 'accetta' di input del file - è utile?


338

L'implementazione di un caricamento di file in html è abbastanza semplice, ma ho appena notato che esiste un attributo 'accetta' che può essere aggiunto al <input type="file" ...>tag.

Questo attributo è utile come modo per limitare il caricamento di file su immagini, ecc.? Qual è il modo migliore per usarlo?

In alternativa, esiste un modo per limitare i tipi di file, preferibilmente nella finestra di dialogo del file, per un tag di input del file html?


1
Per quanto riguarda la risposta di Li Huan, il link giusto a w3school è: w3schools.com/TAGS/att_input_accept.asp
PixEye,

1
Ho appena provato a utilizzare 'accept = application / x-gzip' e ha funzionato con 'Chrome 19.0.1084.52', ma non fa nulla in 'FF 13.0' e 'IE 8.0.6001'.
Jeach,

Dai un'occhiata a jsfiddle.net/jhfrench/cukjxnp6/embedded/result per un modo per migliorare input type="file"per confermare che acceptpossono essere scelti solo i tipi di file ed.
Jeromy francese,

Risposte:


439

L' acceptattributo è incredibilmente utile. È un suggerimento per i browser mostrare solo i file consentiti per la corrente input. Mentre in genere può essere sovrascritto dagli utenti, aiuta a restringere i risultati per impostazione predefinita, in modo che possano ottenere esattamente ciò che stanno cercando senza dover scorrere tra centinaia di tipi di file diversi.

uso

Nota: questi esempi sono stati scritti in base alle specifiche correnti e potrebbero non funzionare effettivamente in tutti (o in nessuno) browser. Le specifiche potrebbero anche cambiare in futuro, il che potrebbe rompere questi esempi.

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>

Dalla specifica HTML ( fonte )

L' acceptattributo può essere specificato per fornire agli interpreti un suggerimento su quali tipi di file saranno accettati.

Se specificato, l'attributo deve essere costituito da un insieme di token separati da virgola , ognuno dei quali deve essere una corrispondenza ASCII senza distinzione tra maiuscole e minuscole per uno dei seguenti:

La stringa audio/*

  • Indica che i file audio sono accettati.

La stringa video/*

  • Indica che i file video sono accettati.

La stringa image/*

  • Indica che i file di immagine sono accettati.

Un tipo MIME valido senza parametri

  • Indica che sono accettati file del tipo specificato.

Una stringa il cui primo carattere è un carattere FULL STOP U + 002E (.)

  • Indica che i file con l'estensione specificata sono accettati.

71
Avevo bisogno di accettare file JPG, PNG, GIF, PDF ed EPS, ma accept='.jpg,.png,.gif,.pdf,.eps'non consentivo alcuna selezione. Ho provato molte varianti: delimitato da spazi, nessun punto, ecc., Ma nessun dado in Chrome v20, quindi ho finito per usare i tipi MIME e ha funzionato benissimo:accept='image/jpeg,image/gif,image/png,application/pdf,image/x-eps'
Charlie Schliesser,

7
Posso solo far funzionare quanto sopra in Chrome. In Firefox 13 non riesco a far funzionare più tipi di file (separati da virgola o altro) oltre a fare un singolo tipo di carattere jolly come image/*. Bummer.
Charlie Schliesser,

3
Secondo le specifiche: Value: A set of comma-separated strings, each of which is a valid MIME type, with no parameters.solo i tipi mime. Nessuna estensione. Spetta al cliente determinare il tipo di mime.
Rudie,

7
Non sono sicuro di dove stai ottenendo le tue informazioni, ma nelle specifiche a cui mi sono collegato nella risposta, questo è elencato come perfettamente valido: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 che non puoi caricare mp4 in Safari, dovrai anche specificarevideo/mp4
Kit Sunde il

88

Sì, è estremamente utile nei browser che lo supportano, ma il "limite" è una comodità per gli utenti (quindi non sono sopraffatti da file irrilevanti) piuttosto che un modo per impedire loro di caricare cose che non le desideri upload.

È supportato in

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

Ecco un elenco di tipi di contenuto che puoi usare con esso, seguito dalle estensioni di file corrispondenti (anche se ovviamente puoi usare qualsiasi estensione di file):

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

Non vedo nulla per i caratteri, come application / font-woff o application / x-font-ttf.
Triynko,

@Triynko Ho lo stesso problema, ma vedo che, ad esempio Chrome, carica un carattere ttf come "application / octet-stream", quindi non può essere utilizzato in un elemento di input di file ...
estani,

Scopri solo che accetta può anche usare suffissi di file! quindi accept=".ttf"funziona come previsto.
estani,

36

Nel 2015 l'unico modo che ho trovato per farlo funzionare sia per Chrome che per Firefox è mettere tutte le possibili estensioni che vuoi supportare, comprese le varianti:

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

Problema con Firefox : l'utilizzo del image/jpegtipo mime Firefox mostrerà solo i .jpgfile, molto strano come se il comune .jpegnon fosse ok ...

Qualunque cosa tu faccia, assicurati di provare con file con molte estensioni diverse. Forse dipende anche dal sistema operativo ... Suppongo che non faccia acceptdistinzione tra maiuscole e minuscole, ma forse non in tutti i browser.

Ecco i documenti MDN su Accept :

accetta Se il valore dell'attributo type è file, questo attributo indicherà i tipi di file accettati dal server, altrimenti verrà ignorato. Il valore deve essere un elenco separato da virgole di identificatori univoci del tipo di contenuto:

    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

1
Questa è la risposta migliore, perché riguarda la compatibilità tra browser.
mbomb007,

1
Questa risposta è buona Ricorda di includere il carattere "STOP", ".". Questo era il mio problema.
fungusanthrax

35

L'attributo Accept è stato introdotto in RFC 1867 , con l'intenzione di abilitare il filtro del tipo di file basato sul tipo MIME per il controllo di selezione del file. Ma a partire dal 2008, la maggior parte, se non tutti, i browser non fanno uso di questo attributo. Utilizzando gli script lato client, è possibile effettuare una sorta di convalida basata sull'estensione, per inviare dati di tipo corretto (estensione).

Altre soluzioni per il caricamento di file avanzato richiedono filmati Flash come SWFUpload o applet Java come JUpload .


5
Secondo Wikipedia ( en.wikipedia.org/wiki/… ), Opera sembra essere l'unico browser che la supporta. È un vero peccato, davvero.
Zecc,

4
Chrome sembra usarlo. probabilmente ha trovato la sua strada nel
webkit

9
"L'attributo accetta è attualmente supportato solo da Opera 11+, Chrome 16+ e Firefox 9+." Da: en.wikipedia.org/wiki/File_select#Accept_attribute_support
Simon

6
IE 10+ supporta l'attributo accetta. Fu l'ultimo sbandato a non farlo.
sj26,

1
La risposta corretta è la più recente uno per @bfrohs - tipi MIME: iana.org/assignments/media-types~~V~~singular~~3rd
juanmirocks

24

È supportato da Chrome. Non dovrebbe essere usato per la validazione, ma per suggerire il tipo di sistema operativo. Se hai un accept="image/jpeg"attributo in un caricamento di file, il sistema operativo può mostrare solo file del tipo suggerito.


6
Confermo che accept="image/*"funziona su Firefox, Chrome e Opera.
remi.gaubert,

1
non funziona in Safari, sto usando Safari 5.1.7 in Windows
Anand

@MMMMS È necessario fornire il tipo MIME, anziché l'estensione del file. Usa accept="text/plain"invece.
mbomb007,

12

Sono passati alcuni anni e Chrome utilizza almeno questo attributo. Questo attributo è molto utile dal punto di vista dell'usabilità in quanto filtrerà i file non necessari per l'utente, rendendo la loro esperienza più fluida. Tuttavia, l'utente può comunque selezionare "tutti i file" dal tipo (o altrimenti ignorare il filtro), quindi è necessario convalidare sempre il file in cui è effettivamente utilizzato; Se lo stai usando sul server, validalo lì prima di usarlo. L'utente può sempre ignorare qualsiasi script sul lato client.


6

Se il browser utilizza questo attributo, è solo un aiuto per l'utente, quindi non caricherà un file multi-megabyte solo per vederlo rifiutato dal server ...
Lo stesso per il <input type="hidden" name="MAX_FILE_SIZE" value="100000">tag: se il browser lo utilizza, non invierà il file ma un errore con conseguente UPLOAD_ERR_FORM_SIZE(2) errore in PHP (non sono sicuro di come sia gestito in altre lingue).
Nota: questi sono aiuti per l' utente . Naturalmente, il server deve sempre controllare il tipo e la dimensione del file alla sua estremità: è facile manomettere questi valori sul lato client.


0

Nel 2008 questo non era importante a causa della mancanza di sistemi operativi mobili, ma ora cosa abbastanza importante.

Quando si impostano i tipi di mime accettati, ad esempio all'utente Android viene visualizzata una finestra di dialogo di sistema con app che possono fornirgli il contenuto di mime che l'input di file accetta, il che è fantastico perché la navigazione attraverso i file in Esplora file su dispositivi mobili è lenta e spesso stressante .

Una cosa importante è che alcuni browser per dispositivi mobili (basati sulla versione Android di Chrome 36 e Chrome Beta 37) non supportano il filtraggio delle app su estensioni e più tipi di mime.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.