Як перевірити розмір вхідного файлу за допомогою jQuery?


135

У мене є форма з можливостями завантаження файлів, і я хотів би мати можливість приємного звітування про помилку на стороні клієнта, якщо файл, який користувач намагається завантажити, занадто великий, чи є спосіб перевірити розмір файлу за допомогою jQuery, чи чисто на клієнті чи якось відправити файл назад на сервер, щоб перевірити?

Відповіді:


275

Ви фактично не маєте доступу до файлової системи (наприклад, для читання та запису локальних файлів), однак, завдяки специфікації HTML5 File Api, є деякі властивості файлів, до яких у вас є доступ, і розмір файлу є одним з них.

Для HTML нижче

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

спробуйте наступне:

//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, вона працюватиме лише для сучасних браузерів (v10, необхідний для IE), і я додав сюди більше деталей та посилань про іншу інформацію про файли, яку ви повинні знати: http://felipe.sabino.me/javascript / 2012/01/30 / javascipt-check-the-file-size /


Підтримка старих браузерів

Майте на увазі, що старі веб-переглядачі повернуть nullзначення попереднього this.filesдзвінка, тому доступ до нього this.files[0]призведе до винятку, і перед його використанням слід перевірити підтримку файлового API.


6
Усі кажуть, що цього зробити не можна - все ж ось це. Це працює. Я тестував це.
Петро

35
@Jeroen Я погоджуюся, що не працює на IE робить це не ідеальним рішенням для багатьох людей, але не дає голосування і не каже, що відповідь марно занадто багато? Я використовував це рішення у великій кількості корпоративних веб-рішень, які мали потребу працювати лише в хромі та / або firefox, і деякі люди, які шукають це рішення, можуть бути в одному місці, тому це рішення буде досить хорошим. .
Феліпе Сабіно

3
Я щойно натрапив на цю відповідь в Google і збираюся використовувати її, щоб зупинити користувачів, які публікують файли понад заданого розміру; оскільки я також перевіряю розміри файлів на стороні сервера, я радий мати рішення на стороні клієнта, яке не працює в IE8.
Стів Вілкс

2
@GaolaiPeng Ця помилка, ймовірно, через те, що jQueryфайл JavaScript не додано (або він не завантажений належним чином). Ви додали його headдо сторінки своєї сторінки?
Феліпе Сабіно

1
@volumeone Ось чому я сказав, що ви повинні "перевірити підтримку файлового API, перш ніж використовувати його" у своїй відповіді, і тоді ви зможете відповідно змінити інтерфейс користувача.
Феліпе Сабіно

41

Якщо ви хочете використовувати jQuery's validate, можете, створивши цей метод:

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

Ви б використовували його:

$('#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
@Да, так, властивість розміру файлу є частиною специфікації HTML5, тому вона працюватиме лише для сучасних браузерів (для IE це буде версія 10+)
Феліпе Сабіно

7
Ви неправильно використали acceptправило, де ви повинні були використовувати це extensionправило. ~ Правило тільки для типів MIME. Правило для розширень файлів. Крім того, необхідно включити в файл для цих правил. acceptextensionadditional-methods.js
Sparky

Доповнюючий коментар @ 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

Цей код:

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

Повертає розмір файлу для введення форми.

У FF 3.6 і пізніших версіях цього коду має бути:

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

2
Ваш кулаковий код працює в хромі, але другий не працює для FireFox найновіше.
Дебора

Цей другий код - це те, що мені довелося використовувати для всіх сучасних браузерів 2014 року.
Dreamcasting

1
Перший код працює IE 10, 11, Edge, Chrome, Safari (версія Windows), Brave та Firefox.
Машукур Рахман

12

Я також розміщую своє рішення, яке використовується для FileUploadконтролю ASP.NET . Можливо, комусь це стане в нагоді.

    $(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
Потрібно перевірити значення нуля f = this.files[0]або це не вдасться у старих браузерах. напр.if (f && (f.size > 8388608 || f.fileSize > 8388608))
Пройшло кодування

9

Використовуйте нижче, щоб перевірити розмір файлу та зрозуміти, чи він більший,

    $("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); Інакше форма, здається, більше не надсилається правильно, не вибравши належне вкладення.
Кевін

1

Ви можете перевіряти цей тип за допомогою Flash або Silverlight, але не Javascript. Пісочниця javascript не дозволяє отримати доступ до файлової системи. Перевірку розміру потрібно буде виконати на стороні сервера після його завантаження.

Якщо ви хочете пройти маршрут Silverlight / Flash, ви можете перевірити, якщо вони не встановлені за замовчуванням до звичайного обробника файлу завантаження файлів, який використовує звичайні елементи керування. Таким чином, якщо встановити Silverlight / Flash, їх досвід буде трохи більш багатим.


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>

Я вважаю, що це найпростіше, якщо ви не плануєте подавати форму за допомогою стандартних методів ajax / html5, але, звичайно, вона працює з чим завгодно.

ПРИМІТКИ:

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

Раніше це працювало, але більше не в хромі, я просто перевірив код вище, і він працював як у ff, так і в chrome (останній). Другий ["0"] тепер є першим дітьми.


0

Будь ласка, спробуйте це:

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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.