Dosya girişi 'kabul et' özelliği - faydalı mı?


338

Html altında bir dosya yüklemesi uygulamak oldukça basittir, ancak <input type="file" ...>etikete eklenebilecek bir 'kabul et' özniteliği olduğunu fark ettim .

Bu özellik, resimlerdeki dosya yüklemelerini sınırlamanın bir yolu olarak faydalı mıdır? Kullanmanın en iyi yolu nedir?

Alternatif olarak, bir html dosya giriş etiketi için, tercihen dosya iletişim kutusunda dosya türlerini sınırlamanın bir yolu var mı?


1
Li Huan adlı cevapta ile ilgili olarak, W3School hakkı link: w3schools.com/TAGS/att_input_accept.asp
PixEye

1
Ben sadece 'accept = application / x-gzip' kullanarak denedim ve 'Chrome 19.0.1084.52' ile çalıştı, ama 'FF 13.0' ve 'IE 8.0.6001' hiçbir şey yapmaz.
Jeach

Check out jsfiddle.net/jhfrench/cukjxnp6/embedded/result geliştirmek için bir yol input type="file"sadece doğrulamak için accepted dosya türleri seçilebilir.
Jeromy French

Yanıtlar:


439

acceptNitelik son derece yararlıdır. Tarayıcıların yalnızca geçerli dosya için izin verilen dosyaları göstermesi için bir ipucudur input. Genellikle kullanıcılar tarafından geçersiz kılsa da, varsayılan olarak kullanıcılar için sonuçları daraltmaya yardımcı olur, böylece yüz farklı dosya türünü elemek zorunda kalmadan tam olarak aradıklarını alabilirler.

kullanım

Not: Bu örnekler geçerli spesifikasyona göre yazılmıştır ve tüm (veya herhangi bir) tarayıcıda gerçekten çalışmayabilir. Spesifikasyon gelecekte de değişebilir ve bu da bu örnekleri kırabilir.

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>

HTML Spesifikasyonundan ( kaynak )

acceptNitelik dosya türleri kabul edilecektir şeyin bir ipucu ile kullanıcı ajanları sağlamak için belirtilebilir.

Belirtilirse, özellik , her biri aşağıdakilerden biri için ASCII büyük / küçük harf duyarlı olmayan bir eşleşme olması gereken bir dizi virgülle ayrılmış belirteçten oluşmalıdır :

Dize audio/*

  • Ses dosyalarının kabul edildiğini gösterir.

Dize video/*

  • Video dosyalarının kabul edildiğini gösterir.

Dize image/*

  • Görüntü dosyalarının kabul edildiğini gösterir.

Bir hayır parametrelerle geçerli MIME türü

  • Belirtilen türde dosyaların kabul edildiğini gösterir.

İlk karakteri U + 002E FULL STOP karakteri (.) Olan bir dize

  • Belirtilen dosya uzantısına sahip dosyaların kabul edildiğini gösterir.

71
JPG, PNG, GIF, PDF ve EPS dosyalarını kabul etmem gerekiyordu, ancak accept='.jpg,.png,.gif,.pdf,.eps'herhangi bir seçime izin vermedim. Birçok varyasyon denedim - boşluk sınırlandı, nokta karakteri vb. Yok, ancak Chrome v20'de zar yok, bu yüzden mime türlerini kullandım ve harika çalıştı:accept='image/jpeg,image/gif,image/png,application/pdf,image/x-eps'
Charlie Schliesser

7
Yukarıdakileri yalnızca Chrome'da çalıştırabilirim. Firefox 13'te (virgülle ayrılmış veya başka şekilde) çalışmak için birden fazla dosya türü gibi tek bir joker karakter türü yapmanın dışında bir dosya bulamıyorum image/*. Aylak.
Charlie Schliesser

3
Spesifikasyona göre: Value: A set of comma-separated strings, each of which is a valid MIME type, with no parameters.Sadece mim türleri. Uzantı yok. Mime tipini belirlemek müşteriye bağlıdır.
Rudie

7
Bilgilerinizi nereden aldığınızdan emin değilim, ancak yanıtta bağlandığım spesifikasyonda, bu tamamen geçerli olarak listeleniyor:A string whose first character is a U+002E FULL STOP character (.) -- Indicates that files with the specified file extension are accepted.
0b10011 31:13

4
video/*mp4'ü Safari'ye yükleyemeyeceğiniz anlamına gelir, ayrıca şunları belirtmeniz gerekirvideo/mp4
Kit Sunde

88

Evet, onu destekleyen tarayıcılarda son derece yararlıdır, ancak "sınırlama", istemediğiniz şeyleri yüklemelerini engellemenin bir yolu olarak, kullanıcılar için bir kolaylıktır (bu nedenle alakasız dosyalarla boğulmuş değildir). yükleme.

İçinde desteklenir

  • Chrome 16 +
  • Safari 6 +
  • Firefox 9 ve sonraki sürümleri
  • IE 10 +
  • Opera 11 +

Burada kullanabileceğiniz içerik türlerinin bir listesi ve ardından ilgili dosya uzantıları (tabii ki herhangi bir dosya uzantısını kullanabilirsiniz):

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

Font / woff veya application / x-font-ttf gibi fontlar için hiçbir şey görmüyorum.
Triynko

@Triynko Aynı sorunum var, ancak örneğin Chrome'un bir ttf yazı tipini "application / octet-stream" olarak yüklediğini görüyorum, bu yüzden bu bir dosya giriş öğesinde kullanılamaz ...
estani

Sadece kabul etmenin dosya soneklerini de kullanabileceğini öğren! böylece accept=".ttf"beklendiği gibi çalışır.
estani

36

2015'te Chrome ve Firefox için çalışmasını sağlamanın tek yolu , varyantlar dahil olmak üzere desteklemek istediğiniz tüm uzantıları koymaktır:

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

Firefox ile ilgili sorun : image/jpegMIME türünü kullanmak Firefox sadece .jpgdosyaları gösterecek , sanki sıradan bir .jpegsorun yok gibi ...

Ne yaparsanız yapın, birçok farklı uzantıya sahip dosyaları denediğinizden emin olun. Belki OS'ye bile bağlı ... Sanırım acceptbüyük / küçük harfe duyarlı değil, ama belki de her tarayıcıda değil.

İşte kabul ile ilgili MDN belgeleri :

accept Tür özniteliğinin değeri dosya ise, bu öznitelik sunucunun kabul ettiği dosya türlerini gösterir, aksi takdirde yoksayılır. Değer, benzersiz içerik türü belirticilerinin virgülle ayrılmış bir listesi olmalıdır:

    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
Bu en iyi yanıttır, çünkü tarayıcılar arası uyumluluğu ele almaktadır.
mbomb007

1
Bu cevap iyi. "STOP" karakterini eklemeyi unutmayın. Benim sorunum buydu.
fungusanthrax

35

Dosya seçme denetimi için MIME türüne göre dosya türü filtrelemeyi etkinleştirmeyi amaçlayan RFC 1867'de kabul niteliği tanıtıldı . Ancak 2008 itibariyle tarayıcıların tümü olmasa da çoğu bu özellikten faydalanmıyor. İstemci tarafı komut dosyalarını kullanarak, doğru türde (uzantı) veri göndermek için bir tür uzantı tabanlı doğrulama yapabilirsiniz.

Gelişmiş dosya yükleme için diğer çözümler SWFUpload gibi Flash filmler veya JUpload gibi Java Applets gerektirir .


5
Wikipedia'ya göre ( en.wikipedia.org/wiki/… ), Opera onu destekleyen tek tarayıcı gibi görünüyor. Gerçekten büyük bir utanç.
Zecc

4
chrome bunu kullanıyor gibi görünüyor. muhtemelen webkit içine yolunu buldu
yincrash

9
"Kabul özelliği şu anda yalnızca Opera 11+, Chrome 16+ ve Firefox 9+ tarafından desteklenmektedir." Gönderen: en.wikipedia.org/wiki/File_select#Accept_attribute_support
Simon

6
IE 10+ kabul etme özelliğini destekler. Bu değil son straggler oldu.
sj26

1
Doğru cevap @bfrohs'dan daha yeni olanıdır - MIME türleri: iana.org/assignments/media-types
juanmirocks

24

Chrome tarafından desteklenir. Doğrulama için değil, işletim sistemini ima eden tip için kullanılması gerekiyordu. accept="image/jpeg"Dosya yüklemede bir özniteliğiniz varsa , işletim sistemi yalnızca önerilen türde dosyaları gösterebilir.


6
accept="image/*"Firefox, Chrome ve Opera'da çalıştığını onaylıyorum .
remi.gaubert

1
Safari'de çalışmıyor, Windows'ta Safari 5.1.7 kullanıyorum
anand

@MMMMS Dosya uzantısı yerine MIME türünü sağlamanız gerekir. accept="text/plain"Bunun yerine kullanın .
mbomb007

12

Birkaç yıl geçti ve Chrome en azından bu özelliği kullanıyor. Bu özellik, kullanıcı için gereksiz dosyaları filtreleyerek deneyimlerini daha pürüzsüz hale getireceğinden kullanılabilirlik açısından çok kullanışlıdır. Ancak, kullanıcı yine de türden "tüm dosyaları" seçebilir (veya filtreyi başka bir şekilde atlayabilir), böylece dosyayı her zaman gerçekte kullanıldığı yerde doğrulamanız gerekir; Sunucuda kullanıyorsanız, kullanmadan önce orada doğrulayın. Kullanıcı her zaman herhangi bir istemci tarafı komut dosyasını atlayabilir.


6

Tarayıcı bu özniteliği kullanıyorsa, bu yalnızca kullanıcı için bir yardımcıdır, bu nedenle yalnızca sunucu tarafından reddedildiğini görmek için çoklu megabaytlık bir dosya yüklemez ... Etiket
için aynıdır <input type="hidden" name="MAX_FILE_SIZE" value="100000">: tarayıcı kullanıyorsa, dosyayı göndermez ancak UPLOAD_ERR_FORM_SIZEPHP'de (2) hataya neden olan bir hata (diğer dillerde nasıl işlendiğinden emin değil).
Bunlar için yardımcı olduğunu unutmayın kullanıcı . Tabii ki, sunucu her zaman dosyanın türünü ve boyutunu kontrol etmelidir: istemci tarafında bu değerlere müdahale etmek kolaydır.


0

2008'de bu, mobil işletim sistemlerinin eksikliği nedeniyle önemli değildi, ancak şimdi oldukça önemli bir şey.

Kabul edilen mim türlerini ayarladığınızda, örneğin Android kullanıcısına, dosya girişinin kabul ettiği mime içeriğini sağlayabilecek uygulamalarla sistem iletişim kutusu verilir, bu harika bir şeydir çünkü mobil cihazlarda dosya gezgini dosyalarında gezinmek yavaş ve genellikle streslidir .

Önemli bir şey, bazı mobil tarayıcıların (Chrome 36 ve Chrome Beta 37'nin Android sürümüne bağlı olarak) uzantılar ve birden fazla mime türü üzerinde uygulama filtrelemeyi desteklememesidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.