Jak sprawdzić rozmiar wejścia pliku za pomocą jQuery?

Mam formularz z możliwościami przesyłania plików i chciałbym móc mieć ładne raportowanie błędów po stronie klienta, jeśli plik, który użytkownik próbuje przesłać, jest zbyt duży, czy istnieje sposób na sprawdzenie rozmiaru pliku za pomocą jQuery, czy to wyłącznie na kliencie, czy jakoś wysyłając plik z powrotem do serwera, aby sprawdzić?

Author: Sharikov Vladislav, 2009-10-21

7 answers

W rzeczywistości nie masz dostępu do systemu plików (na przykład do odczytu i zapisu plików lokalnych), jednak ze względu na specyfikację API plików HTML5 istnieją pewne właściwości plików, do których masz dostęp, a Rozmiar pliku jest jedną z nich.

Dla poniższego HTML

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

Spróbuj:

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

});

Ponieważ jest to część specyfikacji HTML5, będzie działać tylko dla nowoczesnych przeglądarek (V10 wymagane dla IE) i dodałem tutaj więcej szczegółów i linków o innych plikach informacje, które powinieneś znać: http://felipe.sabino.me/javascript/2012/01/30/javascipt-checking-the-file-size/


Obsługa starych przeglądarek

Należy pamiętać, że stare przeglądarki zwrócą wartość {[2] } dla poprzedniego wywołania this.files, więc dostęp do this.files[0] wywoła wyjątek i powinieneś sprawdzić obsługę API plików przed jej użyciem

 253
Author: Felipe Sabino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:49

Jeśli chcesz użyć jQuery ' s validate możesz utworzyć tę metodę:

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

Użyłbyś go:

$('#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" }
});
 37
Author: Naoise Golden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-07 22:31:37

Ten kod:

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

Zwraca Rozmiar Pliku dla wejścia formularza.

Na FF 3.6 i później ten kod powinien być:

$("#yourFileInput")[0].files[0].fileSize;
 19
Author: jeferod83,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-09 20:13:09

Ja też zamieszczam swoje rozwiązanie, używane do ASP.NET Kontrola. Może komuś się przyda.

    $(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;
        }
    })
});
 12
Author: Besnik Kastrati,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-24 09:37:15

Tego typu sprawdzanie można wykonać za pomocą Flasha lub Silverlight, ale nie Javascript. Piaskownica javascript nie zezwala na dostęp do systemu plików. Sprawdzenie rozmiaru musiałoby być wykonane po stronie serwera po jego przesłaniu.

Jeśli chcesz przejść trasę Silverlight / Flash, możesz sprawdzić, czy jeśli nie są one zainstalowane, to domyślnie są to zwykłe procedury przesyłania plików, które używają normalnych kontrolek. W ten sposób, jeśli mają zainstalowany Silverlight / Flash, ich doświadczenie będzie trochę bardziej bogaty.

 1
Author: Kelsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-21 15:17:04

Plese spróbuj tego:

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;
}
 1
Author: Bablu Ahmed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-06 11:44:00
<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>

Uważam, że jest to najłatwiejsze, jeśli nie planujesz przesłać formularza za pomocą standardowych metod ajax / html5, ale oczywiście działa z czymkolwiek.

Uwagi:

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

To kiedyś działało, ale już nie w chrome, właśnie przetestowałem powyższy kod i działało zarówno w FF jak i chrome (Ostatnie). Druga ["0"] jest teraz firstChild.

 0
Author: Dillon Burnett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-11 04:48:38