Atribut input file 'terima' - apakah berguna?

338

Menerapkan unggahan file di bawah html cukup sederhana, tetapi saya hanya memperhatikan bahwa ada atribut 'terima' yang dapat ditambahkan ke <input type="file" ...>tag.

Apakah atribut ini bermanfaat sebagai cara membatasi unggahan file ke gambar, dll? Apa cara terbaik untuk menggunakannya?

Atau, apakah ada cara untuk membatasi jenis file, lebih disukai dalam dialog file, untuk tag input file html?

Darren Oster
sumber
1
Mengenai jawaban Li Huan, tautan yang tepat ke w3school adalah: w3schools.com/TAGS/att_input_accept.asp
PixEye
1
Saya baru saja mencoba menggunakan 'accept = application / x-gzip' dan bekerja dengan 'Chrome 19.0.1084.52', tetapi tidak melakukan apa pun di 'FF 13.0' dan 'IE 8.0.6001'.
Jeach
Lihatlah jsfiddle.net/jhfrench/cukjxnp6/embedded/result untuk mengetahui cara meningkatkan input type="file"untuk memvalidasi bahwa hanya accepttipe file ed yang dapat dipilih.
Jeromy French

Jawaban:

439

The acceptatribut sangat berguna. Ini adalah petunjuk bagi browser untuk hanya menampilkan file yang diizinkan untuk saat ini input. Meskipun biasanya dapat ditimpa oleh pengguna, ini membantu mempersempit hasil bagi pengguna secara default, sehingga mereka bisa mendapatkan apa yang mereka cari tanpa harus menyaring ratusan jenis file yang berbeda.

Pemakaian

Catatan: Contoh-contoh ini ditulis berdasarkan spesifikasi saat ini dan mungkin tidak benar-benar berfungsi di semua (atau apa saja) browser. Spesifikasi juga dapat berubah di masa mendatang, yang dapat memecahkan contoh-contoh ini.

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>

Dari Spesifikasi HTML ( sumber )

The acceptatribut dapat ditentukan untuk memberikan agen pengguna dengan sedikit apa yang akan diterima jenis file.

Jika ditentukan, atribut harus terdiri dari satu set token yang dipisahkan koma , yang masing-masing harus berupa kecocokan tidak peka huruf ASCII untuk salah satu dari berikut ini:

String audio/*

  • Menunjukkan bahwa file suara diterima.

String video/*

  • Menunjukkan bahwa file video diterima.

String image/*

  • Menunjukkan bahwa file gambar diterima.

Sebuah tipe MIME berlaku tanpa parameter

  • Menunjukkan bahwa file dari jenis yang ditentukan diterima.

String yang karakter pertamanya adalah karakter U + 002E FULL STOP (.)

  • Menunjukkan bahwa file dengan ekstensi file yang ditentukan diterima.
0b10011
sumber
71
Saya perlu menerima file JPG, PNG, GIF, PDF, dan EPS, tetapi accept='.jpg,.png,.gif,.pdf,.eps'tidak mengizinkan pemilihan apa pun. Saya mencoba banyak variasi - ruang terbatas, tidak ada karakter titik, dll., Tetapi tidak ada dadu di Chrome v20, jadi saya akhirnya menggunakan jenis pantomim dan itu bekerja dengan sangat baik:accept='image/jpeg,image/gif,image/png,application/pdf,image/x-eps'
Charlie Schliesser
7
Saya hanya bisa mendapatkan yang di atas berfungsi di Chrome. Di Firefox 13 saya tidak bisa mendapatkan beberapa jenis file untuk bekerja (dipisahkan dengan koma atau sebaliknya) selain melakukan jenis wildcard tunggal seperti image/*. Kekecewaan.
Charlie Schliesser
3
Menurut spec: Value: A set of comma-separated strings, each of which is a valid MIME type, with no parameters.Hanya tipe pantomim. Tidak ada ekstensi. Terserah klien untuk menentukan tipe mime.
Rudie
7
Saya tidak yakin dari mana Anda mendapatkan informasi Anda, tetapi dalam spesifikasi yang saya A string whose first character is a U+002E FULL STOP character (.) -- Indicates that files with the specified file extension are accepted.
tautkan
4
video/*berarti Anda tidak dapat mengunggah mp4 di Safari, Anda juga harus menentukanvideo/mp4
Kit Sunde
88

Ya, ini sangat berguna di browser yang mendukungnya, tetapi "pembatasan" adalah untuk kenyamanan pengguna (sehingga mereka tidak dibanjiri dengan file yang tidak relevan) daripada sebagai cara untuk mencegah mereka mengunggah hal-hal yang tidak Anda inginkan. mengunggah.

Didukung di

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

Berikut adalah daftar jenis konten yang dapat Anda gunakan dengannya, diikuti oleh ekstensi file yang sesuai (meskipun tentu saja Anda dapat menggunakan ekstensi file apa pun):

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
iconoclast
sumber
Saya tidak melihat apa pun untuk font, seperti application / font-woff atau application / x-font-ttf.
Triynko
@Triynko Saya memiliki masalah yang sama, tetapi saya melihat bahwa, misalnya Chrome, mengunggah font ttf sebagai "application / octet-stream" jadi ini tidak dapat digunakan dalam elemen input file ...
estani
Cari tahu bahwa menerima juga dapat menggunakan sufiks file! jadi accept=".ttf"berfungsi seperti yang diharapkan.
estani
36

Pada 2015 , satu-satunya cara yang saya temukan untuk membuatnya berfungsi baik untuk Chrome dan Firefox adalah dengan meletakkan semua ekstensi yang mungkin ingin Anda dukung, termasuk varian:

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

Masalah dengan Firefox : Menggunakan image/jpegjenis pantomim Firefox hanya akan menampilkan .jpgfile, sangat aneh seolah-olah masalah umum .jpegtidak ok ...

Apa pun yang Anda lakukan, pastikan untuk mencoba dengan file yang memiliki banyak ekstensi berbeda. Mungkin itu bahkan tergantung pada OS ... Saya kira acceptcase-sensitive, tapi mungkin tidak di setiap browser.

Berikut adalah dokumen MDN tentang penerimaan :

accept Jika nilai atribut type adalah file, maka atribut ini akan menunjukkan jenis file yang diterima server, jika tidak maka akan diabaikan. Nilai harus berupa daftar penentu jenis konten unik yang dipisahkan koma:

    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
sumber
1
Ini adalah jawaban terbaik, karena membahas kompatibilitas lintas-browser.
mbomb007
1
Jawaban ini bagus. Ingatlah untuk memasukkan karakter "STOP", '.' Itu masalah saya.
fungusanthrax
35

Atribut accept diperkenalkan di RFC 1867 , yang bermaksud mengaktifkan penyaringan tipe file berdasarkan tipe MIME untuk kontrol pemilihan file. Tetapi pada tahun 2008, sebagian besar, jika tidak semua, browser tidak menggunakan atribut ini. Menggunakan skrip sisi klien, Anda dapat membuat semacam validasi berbasis ekstensi, untuk mengirimkan data dengan jenis yang benar (ekstensi).

Solusi lain untuk mengunggah file lanjutan memerlukan film Flash seperti SWFUpload atau Java Applets seperti JUpload .

CMS
sumber
5
Menurut Wikipedia ( en.wikipedia.org/wiki/… ), Opera tampaknya menjadi satu-satunya browser yang mendukungnya. Sangat memalukan, sungguh.
Zecc
4
chrome tampaknya menggunakannya. mungkin menemukan jalannya ke webkit
yincrash
9
"Atribut accept saat ini hanya didukung oleh Opera 11+, Chrome 16+ dan Firefox 9+." Dari: en.wikipedia.org/wiki/File_select#Accept_attribute_support
Simon
6
IE 10+ mendukung atribut accept. Pelaku terakhir yang tidak melakukannya.
sj26
1
Jawaban yang benar adalah yang lebih baru oleh @bfrohs - jenis MIME: iana.org/assignments/media-types
juanmirocks
24

Ini didukung oleh Chrome. Ini tidak seharusnya digunakan untuk validasi, tetapi untuk tipe yang mengisyaratkan OS. Jika Anda memiliki accept="image/jpeg"atribut dalam unggahan file, OS hanya dapat menampilkan file dari jenis yang disarankan.

pembuat magik
sumber
6
Saya mengonfirmasi bahwa itu accept="image/*"berfungsi pada Firefox, Chrome dan Opera.
remi.gaubert
1
itu tidak bekerja di Safari, saya menggunakan Safari 5.1.7 pada Windows
anand
@ MMMMS Anda harus memberikan jenis MIME, bukan ekstensi file. Gunakan accept="text/plain"sebagai gantinya.
mbomb007
12

Sudah beberapa tahun, dan Chrome setidaknya memanfaatkan atribut ini. Atribut ini sangat berguna dari sudut pandang kegunaan karena akan menyaring file yang tidak perlu bagi pengguna, membuat pengalaman mereka lebih lancar. Namun, pengguna masih dapat memilih "semua file" dari jenis (atau memotong filter), sehingga Anda harus selalu memvalidasi file di mana itu sebenarnya digunakan; Jika Anda menggunakannya di server, validasi dulu sebelum menggunakannya. Pengguna selalu dapat mem-bypass skrip sisi klien.

Kevin Fee
sumber
6

Jika browser menggunakan atribut ini, itu hanya sebagai bantuan bagi pengguna, jadi dia tidak akan mengunggah file multi-megabyte hanya untuk melihatnya ditolak oleh server ...
Sama untuk <input type="hidden" name="MAX_FILE_SIZE" value="100000">tag: jika browser menggunakannya, itu tidak akan mengirim file tetapi kesalahan yang menghasilkan UPLOAD_ERR_FORM_SIZE(2) kesalahan dalam PHP (tidak yakin bagaimana itu ditangani dalam bahasa lain).
Perhatikan ini adalah bantuan untuk pengguna . Tentu saja, server harus selalu memeriksa jenis dan ukuran file di ujungnya: mudah untuk merusak nilai-nilai ini di sisi klien.

PhiLho
sumber
0

Kembali pada tahun 2008 ini tidak penting karena kurangnya OS ponsel tetapi sekarang hal yang cukup penting.

Ketika Anda mengatur jenis mime yang diterima, maka misalnya pengguna Android diberi dialog sistem dengan aplikasi yang dapat memberinya konten mime yang menerima input file, apa yang hebat karena menavigasi melalui file dalam file explorer pada perangkat seluler lambat dan sering membuat stres .

Satu hal penting adalah bahwa beberapa peramban seluler (berdasarkan versi Android Chrome 36 dan Chrome Beta 37) tidak mendukung pemfilteran aplikasi melalui ekstensi dan beberapa jenis mime.

KubaBest
sumber