Bagaimana cara memeriksa ukuran input file dengan jQuery?

135

Saya memiliki formulir dengan kemampuan unggah file dan saya ingin dapat melaporkan kesalahan sisi klien yang bagus jika file yang coba diunggah pengguna terlalu besar, apakah ada cara untuk memeriksa ukuran file dengan jQuery, baik murni pada klien atau entah bagaimana memposting file kembali ke server untuk memeriksa?

Jimmy
sumber

Jawaban:

275

Anda sebenarnya tidak memiliki akses ke sistem file (misalnya membaca dan menulis file lokal), namun, karena spesifikasi File HTML5 Api, ada beberapa properti file yang Anda memiliki akses, dan ukuran file adalah salah satunya.

Untuk HTML di bawah ini

<input type="file" id="myFile" />

coba yang berikut ini:

//binds to onchange event of your input field
$('#myFile').bind('change', function() {

  //this.files[0].size gets the size of your file.
  alert(this.files[0].size);

});

Karena ini adalah bagian dari spesifikasi HTML5, itu hanya akan berfungsi untuk browser modern (v10 diperlukan untuk IE) dan saya menambahkan di sini lebih detail dan tautan tentang informasi file lain yang harus Anda ketahui: http://felipe.sabino.me/javascript / 2012/01/30 / javascipt-checking-the-file-size /


Dukungan browser lama

Ketahuilah bahwa browser lama akan mengembalikan nullnilai untuk this.filespanggilan sebelumnya , jadi mengakses this.files[0]akan menimbulkan pengecualian dan Anda harus memeriksa dukungan File API sebelum menggunakannya

Felipe Sabino
sumber
6
Semua orang mengatakan ini tidak dapat dilakukan - namun ini dia. Ini bekerja. Saya mengujinya.
Peter
35
@ Joen Saya setuju bahwa tidak bekerja untuk IE membuatnya bukan solusi yang ideal untuk banyak orang, tetapi tidak memberikan suara dan mengatakan jawabannya tidak berguna terlalu banyak? Saya menggunakan solusi ini dalam berbagai macam solusi web perusahaan yang dalam cakupan kebutuhan untuk hanya bekerja di chrome dan / atau firefox, dan beberapa orang yang mencari solusi ini mungkin berada di tempat yang sama, sehingga solusi ini akan cukup baik .
Felipe Sabino
3
Saya baru saja menemukan jawaban ini di Google dan saya akan menggunakannya untuk menghentikan pengguna memposting file yang melebihi ukuran tertentu; karena saya juga memeriksa ukuran file di sisi server saya senang memiliki solusi sisi klien yang tidak berfungsi di IE8.
Steve Wilkes
2
@ GaolaiPeng Kesalahan ini mungkin karena jQueryfile javascript tidak ditambahkan (atau tidak dimuat dengan benar). Apakah Anda menambahkannya di headhalaman Anda?
Felipe Sabino
1
@volumeone Itulah sebabnya saya mengatakan Anda harus "memeriksa dukungan File API sebelum menggunakannya" dalam jawaban saya dan kemudian Anda dapat mengubah UI sesuai.
Felipe Sabino
41

Jika Anda ingin menggunakan jQuery, validateAnda bisa dengan membuat metode ini:

$.validator.addMethod('filesize', function(value, element, param) {
    // param = size (en bytes) 
    // element = element to validate (<input>)
    // value = value of the element (file name)
    return this.optional(element) || (element.files[0].size <= param) 
});

Anda akan menggunakannya:

$('#formid').validate({
    rules: { inputimage: { required: true, accept: "png|jpe?g|gif", filesize: 1048576  }},
    messages: { inputimage: "File must be JPG, GIF or PNG, less than 1MB" }
});
Naoise Golden
sumber
1
@Dan ya, properti ukuran file adalah bagian dari spesifikasi HTML5, jadi itu hanya akan berfungsi untuk browser modern (untuk IE itu akan menjadi versi 10+)
Felipe Sabino
7
Anda salah menggunakan acceptaturan, di mana Anda seharusnya menggunakan extensionaturan. ~ The acceptAturan ini hanya untuk jenis MIME. The extensionAturan ini untuk ekstensi file. Anda juga perlu menyertakan dalam additional-methods.jsberkas untuk aturan ini.
Sparky
Melengkapi komentar tegas @ Sparky: $('#formid').validate({ rules: { inputimage: { required: true, extension: "png|jpe?g|gif", filesize: 1048576 }}, messages: { inputimage: "File must be JPG, GIF or PNG, less than 1MB" } });
victorf
26

Kode ini:

$("#yourFileInput")[0].files[0].size;

Mengembalikan ukuran file untuk input formulir.

Pada FF 3.6 dan yang lebih baru, kode ini harus:

$("#yourFileInput")[0].files[0].fileSize;
jeferod83
sumber
2
Kode tinju Anda berfungsi di chrome tetapi yang kedua tidak berfungsi untuk FireFox terbaru.
Débora
Kode kedua itulah yang harus saya gunakan untuk semua browser modern (2014+).
Dreamcasting
1
Kode pertama berfungsi IE 10, 11, Edge, Chrome, Safari (versi Windows), Brave dan Firefox.
Mashukur Rahman
12

Saya memposting solusi saya juga, digunakan untuk FileUploadkontrol ASP.NET . Mungkin seseorang akan merasakan manfaatnya.

    $(function () {        
    $('<%= fileUploadCV.ClientID %>').change(function () {

        //because this is single file upload I use only first index
        var f = this.files[0]

        //here I CHECK if the FILE SIZE is bigger than 8 MB (numbers below are in bytes)
        if (f.size > 8388608 || f.fileSize > 8388608)
        {
           //show an alert to the user
           alert("Allowed file size exceeded. (Max. 8 MB)")

           //reset file upload control
           this.value = null;
        }
    })
});
Besnik Kastrati
sumber
1
Anda perlu memeriksa ulang nilai f = this.files[0]atau ini akan gagal pada browser lama. misif (f && (f.size > 8388608 || f.fileSize > 8388608))
Lewat Coding
9

Gunakan di bawah untuk memeriksa ukuran file dan hapus jika lebih besar,

    $("input[type='file']").on("change", function () {
     if(this.files[0].size > 2000000) {
       alert("Please upload file less than 2MB. Thanks!!");
       $(this).val('');
     }
    });
Umesh Patil
sumber
1
Harus menggunakan $ (ini) .val (null); Kalau tidak, formulir itu tampaknya tidak mengirimkan dengan benar lagi tanpa memilih lampiran yang tepat.
Kevin Grabher
1

Anda dapat melakukan pemeriksaan jenis ini dengan Flash atau Silverlight tetapi tidak dengan Javascript. Kotak pasir javascript tidak memungkinkan akses ke sistem file. Pemeriksaan ukuran perlu dilakukan di sisi server setelah diunggah.

Jika Anda ingin pergi rute Silverlight / Flash, Anda dapat memeriksa bahwa jika mereka tidak diinstal secara default ke penangan upload file biasa yang menggunakan kontrol normal. Dengan cara ini, jika Silverlight / Flash diinstal, pengalaman mereka akan sedikit lebih kaya.

Kelsey
sumber
1
<form id="uploadForm" class="disp-inline" role="form" action="" method="post" enctype="multipart/form-data">
    <input type="file" name="file" id="file">
</form>
<button onclick="checkSize();"></button>
<script>
    function checkSize(){
        var size = $('#uploadForm')["0"].firstChild.files["0"].size;
        console.log(size);
    }
</script>

Saya menemukan ini sebagai yang termudah jika Anda tidak berencana mengirimkan formulir melalui metode ajax / html5 standar, tapi tentu saja itu berfungsi dengan apa pun.

CATATAN:

var size = $('#uploadForm')["0"]["0"].files["0"].size;

Ini digunakan untuk bekerja, tetapi tidak di chrome lagi, saya baru saja menguji kode di atas dan itu berfungsi baik di ff dan chrome (terbaru). ["0"] yang kedua sekarang adalah anak pertama.

Dillon Burnett
sumber
0

Silakan coba ini:

var sizeInKB = input.files[0].size/1024; //Normally files are in bytes but for KB divide by 1024 and so on
var sizeLimit= 30;

if (sizeInKB >= sizeLimit) {
    alert("Max file size 30KB");
    return false;
}
Bablu Ahmed
sumber