Saya ingin membatasi jenis file yang dapat dipilih dari pemilih file OS asli ketika pengguna mengklik tombol Browse di <input type="file">
elemen dalam HTML. Saya punya perasaan itu tidak mungkin, tapi saya ingin tahu apakah ada adalah solusi. Saya hanya ingin tetap menggunakan HTML dan JavaScript; tolong jangan flash.
667
Jawaban:
Sebenarnya, jawabannya adalah tidak . Pengembang tidak dapat mencegah pengguna dari mengunggah file jenis atau ekstensi apa pun.
Namun tetap saja, atribut accept
<input type = "file">
dapat membantu menyediakan filter di kotak dialog pilih file OS. Sebagai contoh,harus menyediakan cara untuk memfilter file selain .xls atau .xlsx. Meskipun halaman MDN untuk
input
elemen selalu mengatakan bahwa ia mendukung ini, saya terkejut, ini tidak berfungsi untuk saya di Firefox hingga versi 42. Ini berfungsi di IE 10+, Edge, dan Chrome.Jadi, untuk mendukung Firefox yang lebih tua dari 42 bersama dengan IE 10+, Edge, Chrome, dan Opera, saya kira lebih baik menggunakan daftar tipe-MIME yang dipisahkan koma:
Perilaku [ Edge (EdgeHTML): Dropdown filter tipe file menunjukkan tipe file yang disebutkan di sini, tetapi bukan default dalam dropdown. Filter default adalah
All files (*)
.]Anda juga dapat menggunakan tanda bintang di tipe-MIME. Sebagai contoh:
W3C merekomendasikan penulis untuk menentukan tipe MIME dan ekstensi yang sesuai dalam
accept
atribut. Jadi, pendekatan terbaik adalah:JSFiddle sama: di sini .
Referensi: Daftar tipe-MIME
PENTING: Menggunakan
accept
atribut hanya menyediakan cara pemfilteran dalam file tipe yang menarik. Browser masih memungkinkan pengguna untuk memilih file jenis apa pun. Pemeriksaan tambahan (sisi klien) harus dilakukan (menggunakan JavaScript, salah satu caranya adalah ini ), dan pasti jenis file HARUS diverifikasi di server , menggunakan kombinasi tipe MIME menggunakan ekstensi file dan tanda tangan binernya ( ASP) .NET , PHP , Ruby , Java ). Anda mungkin juga ingin merujuk ke tabel ini untuk jenis file dan angka ajaibnya, untuk melakukan verifikasi sisi server yang lebih kuat.Berikut adalah tiga bacaan yang bagus tentang pengunggahan file dan keamanan.
EDIT: Mungkin verifikasi jenis file menggunakan tanda tangan binernya juga dapat dilakukan di sisi klien menggunakan JavaScript (bukan hanya dengan melihat ekstensi) menggunakan HTML5 File API, tetapi tetap saja, file tersebut harus diverifikasi di server, karena pengguna jahat masih dapat mengunggah file dengan membuat permintaan HTTP khusus.
sumber
accept
masih tidak berfungsi di Edge: stackoverflow.com/questions/31875617/… . Lebih detail di sini: wpdev.uservoice.com/forums/257854-microsoft-edge-developer/…exclude="exe"
. ¯_ (ツ) _ / ¯Ada atribut accept untuk tag input. Namun, itu tidak dapat diandalkan dengan cara apa pun. Peramban kemungkinan besar memperlakukannya sebagai "saran", yang berarti pengguna akan, tergantung pada pengelola file juga, memiliki pilihan awal yang hanya menampilkan jenis yang diinginkan. Mereka masih dapat memilih "semua file" dan mengunggah file apa pun yang mereka inginkan.
Sebagai contoh:
Baca lebih lanjut di spec HTML5
Perlu diingat bahwa itu hanya untuk digunakan sebagai "bantuan" bagi pengguna untuk menemukan file yang tepat. Setiap pengguna dapat mengirim permintaan apa pun yang dia inginkan ke server Anda. Anda selalu harus memvalidasi semua sisi server.
Jadi jawabannya adalah: tidak, Anda tidak dapat membatasi , tetapi Anda dapat mengatur pra-pemilihan tetapi Anda tidak dapat mengandalkannya.
Sebagai alternatif atau tambahan, Anda dapat melakukan sesuatu yang serupa dengan memeriksa nama file (nilai bidang input) dengan JavaScript, tetapi ini tidak masuk akal karena tidak memberikan perlindungan dan juga tidak memudahkan pemilihan bagi pengguna. Itu hanya berpotensi menipu webmaster untuk berpikir bahwa dia dilindungi dan membuka celah keamanan. Ini bisa menyebalkan bagi pengguna yang memiliki ekstensi file alternatif (misalnya jpeg alih-alih jpg), huruf besar, atau tidak ada ekstensi file apa pun (seperti yang biasa terjadi pada sistem Linux).
sumber
Anda dapat menggunakan
change
acara tersebut untuk memantau apa yang dipilih pengguna dan memberi tahu mereka pada saat itu bahwa file tersebut tidak dapat diterima. Itu tidak membatasi daftar aktual file yang ditampilkan, tetapi ini adalah yang terdekat yang dapat Anda lakukan di sisi klien, selainaccept
atribut yang didukung kurang .JSFiddle
sumber
Ya kamu benar. Tidak mungkin dengan HTML. Pengguna akan dapat memilih file apa pun yang dia inginkan.
Anda bisa menulis sepotong JavaScript kode untuk menghindari pengiriman file berdasarkan ekstensi. Tetapi perlu diingat bahwa ini tidak berarti akan mencegah pengguna jahat untuk mengirimkan file apa pun yang ia inginkan.
Sesuatu seperti:
Kode HTML:
sumber
Secara teknis Anda dapat menentukan
accept
atribut (alternatif di html5 ) padainput
elemen, tetapi tidak didukung dengan benar.sumber
Gunakan
input
tag denganaccept
atributKlik di sini untuk tabel kompatibilitas browser terbaru
Demo langsung di sini
Untuk hanya memilih file gambar, Anda dapat menggunakan ini
accept="image/*"
Demo langsung di sini
Hanya gif, jpg, dan png yang akan ditampilkan, ambil layar dari Chrome versi 44
sumber
accept="image/*"
, ia mengatakan "File Gambar" bukan "File Kustom" di pemilih file, yang bagus untuk pengguna akhir.Saya tahu ini agak terlambat.
sumber
Anda sebenarnya dapat melakukannya dengan javascript tetapi ingat js adalah sisi klien, jadi Anda sebenarnya akan "memperingatkan pengguna" jenis file apa yang dapat mereka unggah, jika Anda ingin MENGHINDARI (membatasi atau membatasi seperti yang Anda katakan) jenis file tertentu yang HARUS DILAKUKAN. lakukan di sisi server.
Lihatlah tut dasar ini jika Anda ingin memulai dengan validasi sisi server. Untuk keseluruhan tutorial, kunjungi halaman ini .
Semoga berhasil!
sumber
Seperti disebutkan dalam jawaban sebelumnya, kami tidak dapat membatasi pengguna untuk memilih file hanya untuk format file yang diberikan. Tapi itu sangat berguna untuk menggunakan tag accept pada atribut file dalam html.
Adapun validasi, kita harus melakukannya di sisi server. Kita juga bisa melakukannya di sisi klien dalam js tetapi itu bukan solusi yang mudah. Kita harus memvalidasi di sisi server.
Untuk persyaratan ini saya sangat suka kerangka kerja pengembangan aplikasi web struts2 Java. Dengan fitur unggah file bawaannya, mengunggah file ke aplikasi web berbasis struts2 adalah hal yang mudah. Cukup sebutkan format file yang ingin kami terima di aplikasi kami dan sisanya diurus oleh inti kerangka itu sendiri. Anda dapat memeriksanya di situs resmi struts.
sumber
Saya dapat menyarankan berikut:
Jika Anda harus membuat pengguna memilih salah satu file gambar secara default, gunakan accept = "image / *"
<input type="file" accept="image/*" />
jika Anda ingin membatasi untuk tipe gambar tertentu maka gunakan accept = "image / bmp, image / jpeg, image / png"
<input type="file" accept="image/bmp, image/jpeg, image/png" />
jika Anda ingin membatasi untuk tipe tertentu maka gunakan accept = ". bmp, .doc, .pdf"
<input type="file" accept=".bmp, .doc, .pdf" />
Anda tidak dapat membatasi pengguna untuk mengubah file filer ke semua file, jadi selalu memvalidasi jenis file dalam skrip dan server
sumber