JQuery ile dosya giriş boyutu nasıl kontrol edilir?


135

Dosya yükleme özelliklerine sahip bir formum var ve kullanıcının yüklemeye çalıştığı dosya çok büyükse, jQuery ile dosya boyutuna karşı kontrol etmek için bir yol var mı, bazı güzel istemci tarafı hata raporlaması yapmak istiyorum istemcide veya bir şekilde dosyayı kontrol etmek için sunucuya geri gönderme?

Yanıtlar:


275

Aslında dosya sistemine erişiminiz yoktur (örneğin, yerel dosyaları okuma ve yazma), ancak HTML5 Dosya Api belirtimi nedeniyle, erişiminiz olan bazı dosya özellikleri vardır ve dosya boyutu bunlardan biridir.

Aşağıdaki HTML için

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

takip etmeyi dene:

//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);

});

HTML5 spesifikasyonunun bir parçası olduğundan, sadece modern tarayıcılar için çalışacaktır (IE için v10 gerekir) ve buraya bilmeniz gereken diğer dosya bilgileri hakkında daha fazla ayrıntı ve bağlantı ekledim : http://felipe.sabino.me/javascript / 2012/01/30 / javascipt denetimi-dosya boyutu /


Eski tarayıcılar desteği

Eski tarayıcıların nullönceki this.filesarama için bir değer döndüreceğini unutmayın , bu nedenle erişim this.files[0]bir istisna doğuracaktır ve kullanmadan önce Dosya API'sı desteğini kontrol etmelisiniz


6
Herkes bunun yapılamayacağını söylüyor - ama işte burada. Bu çalışıyor. Test ettim.
Peter

35
@Jeroen IE için çalışmamanın pek çok insan için ideal bir çözüm olmadığını kabul ediyorum, ancak aşağı oy vermiyor ve cevabın biraz fazla yararsız olduğunu söylemiyor musunuz? Bu çözümü, yalnızca krom ve / veya firefox'ta çalışma ihtiyacı olan çok çeşitli kurumsal web çözümlerinde kullandım ve bu çözümü arayan bazı insanlar aynı noktada olabilir, bu nedenle bu çözüm yeterince iyi olacak .
Felipe Sabino

3
Google'da bu yanıta rastladım ve kullanıcıların belirli bir boyutun üzerindeki dosyaları göndermelerini durdurmak için kullanacağım; Ayrıca sunucu tarafında dosya boyutlarını kontrol gibi IE8 çalışmıyor bir istemci tarafı çözüm var mutluyum.
Steve Wilkes

2
@GaolaiPeng Bu hata muhtemelen jQueryjavascript dosyasının eklenmemiş olması (veya düzgün yüklenmemiş olması) nedeniyledir. headSayfanızın sonuna eklediniz mi?
Felipe Sabino

1
@volumeone Bu yüzden cevabımda "Kullanmadan önce Dosya API'sı desteğini kontrol etmelisiniz" dedim ve sonra kullanıcı arayüzünü buna göre değiştirebilirsiniz.
Felipe Sabino

41

JQuery's kullanmak validateistiyorsanız bu yöntemi oluşturarak yapabilirsiniz:

$.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) 
});

Kullanırsınız:

$('#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" }
});

1
@ Evet, dosya boyutu özelliği HTML5 belirtiminin bir parçasıdır, bu yüzden yalnızca modern tarayıcılar için çalışır (IE için sürüm 10+ olur)
Felipe Sabino

7
acceptKuralı yanlış kullandınız , burada extensionkuralı kullanmış olmalısınız . ~ Kural sadece MIME türleri içindir. Kural dosya uzantıları içindir. Bu kurallar için dosyayı da eklemeniz gerekir . acceptextensionadditional-methods.js
Sparky

Tamamlayıcı $('#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" } });
kıvılcım

26

Bu kod:

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

Form girişi için dosya boyutunu döndürür.

FF 3.6 ve sonrasında bu kod şöyle olmalıdır:

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

2
Yumruk kodunuz kromda çalışıyor ancak ikincisi en son FireFox için çalışmıyor.
Débora

Bu ikinci kod, tüm modern (2014+ tarayıcılar) için kullanmam gereken şeydi.
Dreamcasting

1
İlk kod IE 10, 11, Edge, Chrome, Safari (Windows sürümü), Brave ve Firefox'ta çalışır.
Mashukur Rahman

12

Çözümümü de gönderiyorum, ASP.NET FileUploaddenetimi için kullanıyorum. Belki birisi bunu yararlı bulacaktır.

    $(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;
        }
    })
});

1
Değerini null olarak kontrol etmeniz gerekir, f = this.files[0]aksi takdirde eski tarayıcılarda başarısız olur. ör.if (f && (f.size > 8388608 || f.fileSize > 8388608))
kodlaması gitti

9

Dosyanın boyutunu kontrol etmek ve daha büyük olup olmadığını temizlemek için aşağıdakini kullanın,

    $("input[type='file']").on("change", function () {
     if(this.files[0].size > 2000000) {
       alert("Please upload file less than 2MB. Thanks!!");
       $(this).val('');
     }
    });

1
$ (This) .val (null) kullanmalı; Aksi takdirde, form uygun bir ek seçilmeden artık doğru olarak gönderilmiyor gibi görünüyor.
Kevin Grabher

1

Bu tür denetimleri Flash veya Silverlight ile yapabilirsiniz, ancak Javascript ile yapamazsınız. Javascript korumalı alanı dosya sistemine erişime izin vermiyor. Boyut kontrolünün, yüklendikten sonra sunucu tarafında yapılması gerekir.

Silverlight / Flash yoluna gitmek istiyorsanız, varsayılan olarak yüklenmediklerinde normal denetimleri kullanan normal bir dosya yükleme işleyicisine kontrol edebilirsiniz. Bu şekilde, eğer Silverlight / Flash kurulu ise deneyimleri biraz daha zengin olacaktır.


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>

Formu standart ajax / html5 yöntemleri ile göndermeyi planlamıyorsanız en kolayı buldum, ancak elbette herhangi bir şeyle çalışıyor.

NOTLAR:

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

Bu işe yaradı, ama artık krom yok, ben sadece yukarıdaki kodu test ve hem ff hem de krom (en son) çalıştı. İkinci ["0"] şimdi ilkÇocuk.


0

Plese bunu deneyin:

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;
}
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.