Cara membuat input type = file Harus menerima hanya pdf dan xls

102

Saya dulu <input type= "file" name="Upload" >

Sekarang saya ingin membatasi ini dengan hanya menerima file .pdf dan .xls.

Ketika saya mengklik tombol kirim, itu harus memvalidasi ini.

Dan ketika saya mengklik file (PDF / XLS) di halaman web, itu akan terbuka secara otomatis.

Adakah yang bisa memberi beberapa contoh untuk ini?

Manikandan
sumber

Jawaban:

179

Anda dapat melakukannya dengan menggunakan atribut acceptdan menambahkan jenis pantomim yang diizinkan. Tetapi tidak semua browser menghormati atribut itu dan itu dapat dengan mudah dihapus melalui beberapa pemeriksa kode. Jadi dalam kedua kasus, Anda perlu memeriksa jenis file di sisi server (pertanyaan kedua Anda).

Contoh:

<input type="file" name="upload" accept="application/pdf,application/vnd.ms-excel" />

Untuk pertanyaan ketiga Anda "Dan ketika saya mengklik file (PDF / XLS) di halaman web, secara otomatis akan terbuka.":

Anda tidak bisa mencapai itu. Bagaimana PDF atau XLS dibuka di mesin klien diatur oleh pengguna.

feeela
sumber
Hai feeela Ketika saya mengunggah file itu akan disimpan di server. Saya mendengar bahwa dimungkinkan dengan fungsi javascript untuk membuka file .pdf dan .xls dengan mengklik file di browser ...
Manikandan
itu dia ! Kedua sisi klien dan server menjelaskan. Jawaban bagus
3
jika Anda mencantumkan semua file di kotak pilihan. Anda masih bisa mengupload file apapun.
rüff0
59

Anda dapat menggunakan ini:

HTML

<input name="userfile" type="file" accept="application/pdf, application/vnd.ms-excel" />

dukungan saja. PDF dan. File XLS

Radames E. Hernandez
sumber
14

Sayangnya, tidak ada cara yang dijamin untuk melakukannya pada saat pemilihan.

Beberapa browser mendukung acceptatribut untuk inputtag. Ini adalah awal yang baik, tetapi tidak dapat diandalkan sepenuhnya.

<input type="file" name="pic" id="pic" accept="image/gif, image/jpeg" />

Anda dapat menggunakan cfinputdan menjalankan validasi untuk memeriksa ekstensi file saat pengiriman, tetapi bukan jenis mime. Ini lebih baik, tapi tetap tidak bisa dibilang bodoh. File di OSX sering kali tidak memiliki ekstensi file atau pengguna dapat memberi label yang salah pada jenis file tersebut.

ColdFusion's cffiledapat memeriksa jenis mime menggunakan contentTypeproperti result ( cffile.contentType), tetapi itu hanya dapat dilakukan setelah upload. Ini adalah taruhan terbaik Anda, tetapi masih belum 100% aman karena tipe pantomim masih bisa salah.

Joe C
sumber
3
Tolong, jangan pernah memeriksa file berdasarkan ekstensi. Bagaimana dengan executable bernama lolcat.jpg?
feeela
1
Saya pikir apa yang phantom42 coba katakan di sini adalah Anda harus memeriksa ekstensi dan jenis MIME di server. The acceptatribut pada inputtag dapat ditambahkan tapi tidak 100% efektif.
Chris Peters
Saya 100% setuju. Ini tidak dapat diandalkan, tetapi saya merasa OK sebagai pertahanan baris pertama dalam hubungannya dengan cffile.contenttype.
Joe C
Hai Phantom Seperti yang Anda katakan, terima ini hanya berfungsi di chrome bukan di IE. Apakah ada cara lain untuk melakukan ini yang akan didukung oleh semua browser
Manikandan
Sayangnya tidak ada; itulah mengapa saya mengatakan itu tidak dapat diandalkan dan harus digunakan bersama dengan metode lain jika Anda menggunakannya sama sekali.
Joe C
4

Anda bisa menggunakan JavaScript. Pertimbangkan bahwa masalah besar melakukan ini dengan JavaScript adalah mengatur ulang file input. Nah, ini membatasi hanya JPG (untuk PDF Anda harus mengubah jenis mime dan nomor ajaib ):

<form id="form-id">
  <input type="file" id="input-id" accept="image/jpeg"/>
</form>

<script type="text/javascript">
    $(function(){
        $("#input-id").on('change', function(event) {
            var file = event.target.files[0];
            if(file.size>=2*1024*1024) {
                alert("JPG images of maximum 2MB");
                $("#form-id").get(0).reset(); //the tricky part is to "empty" the input file here I reset the form.
                return;
            }

            if(!file.type.match('image/jp.*')) {
                alert("only JPG images");
                $("#form-id").get(0).reset(); //the tricky part is to "empty" the input file here I reset the form.
                return;
            }

            var fileReader = new FileReader();
            fileReader.onload = function(e) {
                var int32View = new Uint8Array(e.target.result);
                //verify the magic number
                // for JPG is 0xFF 0xD8 0xFF 0xE0 (see https://en.wikipedia.org/wiki/List_of_file_signatures)
                if(int32View.length>4 && int32View[0]==0xFF && int32View[1]==0xD8 && int32View[2]==0xFF && int32View[3]==0xE0) {
                    alert("ok!");
                } else {
                    alert("only valid JPG images");
                    $("#form-id").get(0).reset(); //the tricky part is to "empty" the input file here I reset the form.
                    return;
                }
            };
            fileReader.readAsArrayBuffer(file);
        });
    });
</script>

Pertimbangkan bahwa ini telah diuji pada versi terbaru Firefox dan Chrome, dan pada IExplore 10.

Untuk daftar lengkap jenis pantomim lihat Wikipedia .

Untuk daftar lengkap nomor ajaib lihat Wikipedia .

lmiguelmh
sumber
4

Anda dapat mencoba cara berikut

<input type= "file" name="Upload" accept = "application/pdf,.csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel">

ATAU (di asp.net mvc)

@Html.TextBoxFor(x => x.FileName, new { @id = "doc", @type = "file", @accept = "application/pdf,.csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" })
Prashant Odhavani
sumber
2

Saya akan memfilter file di sisi server, karena ada alat, seperti Live HTTP Headers di Firefox yang memungkinkan untuk mengunggah file apa pun, termasuk shell. Orang dapat meretas situs Anda. Lakukan itu situs server, agar aman.

Alexandre Hitchcox
sumber
Ini memang benar! Tolong jangan abaikan nasihat ini
Rodney Salcedo
1

Meskipun contoh khusus ini ditujukan untuk beberapa unggahan file, ini memberikan informasi umum yang dibutuhkan seseorang:

https://developer.mozilla.org/en-US/docs/DOM/File.type

Sejauh bertindak atas file di / download / ini bukan pertanyaan Javascript - melainkan konfigurasi server. Jika pengguna tidak menginstal sesuatu untuk membuka file PDF atau XLS, satu-satunya pilihan mereka adalah mendownloadnya.

Jeremy J Starcher
sumber
0

Jika Anda ingin kontrol upload file membatasi jenis file yang dapat diupload pengguna dengan satu klik tombol maka inilah caranya ..

<script type="text/JavaScript">
<!-- Begin
function TestFileType( fileName, fileTypes ) {
if (!fileName) return;

dots = fileName.split(".")
//get the part AFTER the LAST period.
fileType = "." + dots[dots.length-1];

return (fileTypes.join(".").indexOf(fileType) != -1) ?
alert('That file is OK!') : 
alert("Please only upload files that end in types: \n\n" + (fileTypes.join(" .")) + "\n\nPlease select a new file and try again.");
}
// -->
</script>

Anda kemudian dapat memanggil fungsi dari event seperti onClick tombol di atas, yang terlihat seperti:

onClick = "TestFileType (this.form.uploadfile.value, ['gif', 'jpg', 'png', 'jpeg']);"

Anda dapat mengubahnya menjadi: PDFdanXLS

Anda dapat melihatnya diimplementasikan di sini: Demo

Vishal Suthar
sumber
Terima kasih Vishal Suthar. Saya pikir logika ini pasti membantu saya untuk maju.
Manikandan
Dengan senang hati..Ini pasti akan membantu tapi tetap tidak ada upvote .. ?? @ Manikandan
Vishal Suthar
Masih ada satu keraguan lagi. Saya mencoba membatasi file (hanya PDF & Xls.xlsx) di input type = file. Tetapi berfungsi dengan baik di Google Chrome .. Tetapi saya tidak dapat melakukan ini di IE. Apakah ada solusi untuk membatasi file di IE? Jika ya Tolong buat saya mengikuti jalan yang benar.
Manikandan
Saya baru saja memeriksa ( codestore.net/store.nsf/unid/DOMM-4Q8H9E ) di IE dan berfungsi dengan baik .. @ Manikandan
Vishal Suthar
Dibandingkan dengan accept-atribut, metode ini tidak mempersempit konten folder ke jenis file yang dipilih saat memilih file di mesin lokal.
feeela
0

Coba yang ini:-

              <MyTextField
                id="originalFileName"
                type="file"
                inputProps={{ accept: '.xlsx, .xls, .pdf' }}
                required
                label="Document"
                name="originalFileName"
                onChange={e => this.handleFileRead(e)}
                size="small"
                variant="standard"
              />
Ankit Kumar Rajpoot
sumber