Отримайте розмір файлу перед завантаженням


90

Чи є спосіб дізнатись розмір файлу перед завантаженням файлу за допомогою AJAX / PHP в разі зміни вхідного файлу?




Ось покроковий підручник з отримання імені, типу та розміру файлу codepedia.info/…
Satinder singh,

Відповіді:


133

Для 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);

});

Дивіться наступну тему:

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


1
Чи не існує масиву файлів у Internet Explorer (старіші версії)?
Тіаго Сезар Олівейра

4
Так, це не працює до IE 10 і має лише часткову підтримку в android та ios. caniuse.com/fileapi . Якби це було просто так ...
styks

2
Припускаю, результат у байтах?
Ердал Г.

4
@ErdalG. Хороше питання! У MDN відсутня документація, але FileList.filesвін схожий на масив Fileоб'єктів, що є розширенням Glob. І відповідно до специфікації , Globдійсно визначає sizeвластивість як кількість байт (0 для порожнього файлу). Так що так, результат у байтах .
Джон Вайс

14
<script type="text/javascript">
function AlertFilesize(){
    if(window.ActiveXObject){
        var fso = new ActiveXObject("Scripting.FileSystemObject");
        var filepath = document.getElementById('fileInput').value;
        var thefile = fso.getFile(filepath);
        var sizeinbytes = thefile.size;
    }else{
        var sizeinbytes = document.getElementById('fileInput').files[0].size;
    }

    var fSExt = new Array('Bytes', 'KB', 'MB', 'GB');
    fSize = sizeinbytes; i=0;while(fSize>900){fSize/=1024;i++;}

    alert((Math.round(fSize*100)/100)+' '+fSExt[i]);
}
</script>

<input id="fileInput" type="file" onchange="AlertFilesize();" />

Робота над IE та FF


15
проти, тому що у відповіді використовується ActiveX. у 2015 році навіть Microsoft відмовляється від ActiveX. Хоча це було обґрунтованою пропозицією, я рекомендую розробникам уникати цього зараз і в майбутньому.
Скотт Стоун

3
Мені подобається це рішення, оскільки лише старіші версії IE повернуть true для window.ActiveXObject.
Роб Брейдекер,

@scottstone Я не розумію, чому ви проголосували за всі відповіді, що підтримують застарілі браузери? Ця відповідь набагато чистіша, ніж відповіді, які використовують відбитки пальців у браузері, і ні в якому разі не рекомендує нікому використовувати ActiveX.
Nicolas Bouvrette

@NicolasBouvrette - Я згоден, що ця відповідь набагато чіткіша за інші, але я не можу зараз зняти голос проти. Початкове запитання не вимагало сумісності зі старими версіями IE, і ця відповідь не радить читачам, що більша частина коду підтримує 5-річні версії IE.
Скотт Стоун

@scottstone Насправді ще одна відчутна точка з мого погляду, чому не використовувати ActiveX, полягає в тому, що в IE відображається попереджувальне повідомлення, яке є жахливим (страшним?) користувальницьким досвідом.
Nicolas Bouvrette

13

Ось простий приклад отримання розміру файлу перед завантаженням. Він використовує jQuery для виявлення кожного разу, коли вміст додається або змінюється, але ви все одно можете отримати files[0].sizeбез використання jQuery.

$(document).ready(function() {
  $('#openFile').on('change', function(evt) {
    console.log(this.files[0].size);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="upload.php" enctype="multipart/form-data" method="POST" id="uploadform">
  <input id="openFile" name="img" type="file" />
</form>

Ось більш повний приклад, деякий доказ концептуального коду для перетягування файлів у FormData та завантаження через POST на сервер. Він включає просту перевірку розміру файлу.


8

У мене була та сама проблема, і, схоже, у нас не було точного рішення. Сподіваюся, це може допомогти іншим людям.

Потрапивши час на вивчення, я нарешті знайшов відповідь. Це мій код для отримання вкладення файлу за допомогою jQuery:

var attach_id = "id_of_attachment_file";
var size = $('#'+attach_id)[0].files[0].size;
alert(size);

Це лише приклад коду для отримання розміру файлу. Якщо ви хочете займатися іншими справами, сміливо змінюйте код, щоб задовольнити ваші потреби.


Мені подобається цей, тому що його не потрібно ставити на подію змін, як найпопулярніше рішення. І мені також подобається той факт, що ви дали мені дозвіл змінити код, щоб задовольнити мої потреби :)
Метт,

8

Найкраще рішення для всіх браузерів;)

function GetFileSize(fileid) {
    try {
        var fileSize = 0;
        // for IE
        if(checkIE()) { //we could use this $.browser.msie but since it's deprecated, we'll use this function
            // before making an object of ActiveXObject, 
            // please make sure ActiveX is enabled in your IE browser
            var objFSO = new ActiveXObject("Scripting.FileSystemObject");
            var filePath = $("#" + fileid)[0].value;
            var objFile = objFSO.getFile(filePath);
            var fileSize = objFile.size; //size in b
            fileSize = fileSize / 1048576; //size in mb 
        }
        // for FF, Safari, Opeara and Others
        else {
            fileSize = $("#" + fileid)[0].files[0].size //size in b
            fileSize = fileSize / 1048576; //size in mb 
        }
        alert("Uploaded File Size is" + fileSize + "MB");
    }
    catch (e) {
        alert("Error is :" + e);
    }
}

від http://www.dotnet-tricks.com/Tutorial/jquery/HHLN180712-Get-file-size-before-upload-using-jquery.html

ОНОВЛЕННЯ: Ми будемо використовувати цю функцію, щоб перевірити, чи це браузер IE

function checkIE() {
    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

    if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)){  
        // If Internet Explorer, return version number
        alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))));
    } else {
        // If another browser, return 0
        alert('otherbrowser');
    }

    return false;
}

3
проти, тому що у відповіді використовується ActiveX. у 2015 році навіть Microsoft відмовляється від ActiveX. Хоча це було обґрунтованою пропозицією, я рекомендую розробникам уникати цього зараз і в майбутньому. -
Скотт Стоун

1
$ .browser було вилучено з jQuery у версії 1.9 (застаріло з версії 1.3).
Сільвіо Дельгадо

2
@scottstone це для зворотної сумісності, і це неправда, Microsoft не відмовиться від ActiveX, вона багато використовується в багатьох речах, і ось доказ computerworld.com/article/2481188/internet/…
ucefkh,

@SilvioDelgado Змінивши та оновивши, вони видалили $ .browser у плагін, тому нам знадобиться лише невеликий тест для браузера IE (працює з усіма версіями)
ucefkh

4

$(document).ready(function() {
  $('#openFile').on('change', function(evt) {
    console.log(this.files[0].size);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="upload.php" enctype="multipart/form-data" method="POST" id="uploadform">
  <input id="openFile" name="img" type="file" />
</form>


3

Браузери з підтримкою HTML5 мають властивість файлів для типу введення. Звичайно, це не буде працювати в старих версіях IE.

var inpFiles = document.getElementById('#fileID');
for (var i = 0; i < inpFiles.files.length; ++i) {
    var size = inpFiles.files.item(i).size;
    alert("File Size : " + size);
}

2

Рішення ucefkh працювало найкраще, але оскільки $ .browser застаріло в jQuery 1.91, довелося змінити, щоб використовувати navigator.userAgent:

function IsFileSizeOk(fileid) {
    try {
        var fileSize = 0;
        //for IE
        if (navigator.userAgent.match(/msie/i)) {
            //before making an object of ActiveXObject, 
            //please make sure ActiveX is enabled in your IE browser
            var objFSO = new ActiveXObject("Scripting.FileSystemObject");
            var filePath = $("#" + fileid)[0].value;
            var objFile = objFSO.getFile(filePath);
            var fileSize = objFile.size; //size in b
            fileSize = fileSize / 1048576; //size in mb 
        }
        //for FF, Safari, Opeara and Others
        else {
            fileSize = $("#" + fileid)[0].files[0].size //size in b
            fileSize = fileSize / 1048576; //size in mb 
        }
        return (fileSize < 2.0);
    }
    catch (e) {
        alert("Error is :" + e);
    }
}

1

вам потрібно зробити запит ajax HEAD, щоб отримати розмір файлу. з jquery це приблизно так

  var req = $.ajax({
    type: "HEAD",
    url: yoururl,
    success: function () {
      alert("Size is " + request.getResponseHeader("Content-Length"));
    }
  });

Але якщо це введення файлу буде очищене (порожнє) ?? Чи можете ви зробити приклад подяки
DeLe

1

Не використовуйте, ActiveXоскільки існує велика ймовірність, що воно відобразить страшне попереджувальне повідомлення в Internet Explorer і відлякає ваших користувачів.

Попередження ActiveX

Якщо хтось хоче здійснити цю перевірку, їм слід покладатися лише на об’єкт FileList, доступний у сучасних браузерах, і перевіряти сторону сервера лише для старих браузерів ( прогресивне вдосконалення ).

function getFileSize(fileInputElement){
    if (!fileInputElement.value ||
        typeof fileInputElement.files === 'undefined' ||
        typeof fileInputElement.files[0] === 'undefined' ||
        typeof fileInputElement.files[0].size !== 'number'
    ) {
        // File size is undefined.
        return undefined;
    }

    return fileInputElement.files[0].size;
}

0

Ви можете використовувати функцію розміру файлу PHP. Під час завантаження за допомогою ajax спочатку перевірте розмір файлу, зробивши запит запитом ajax до скрипта php, який перевіряє розмір файлу та повертає значення.



0

Особисто я б сказав відповідь Web World є найкращою сьогодні, враховуючи стандарти HTML. Якщо вам потрібно підтримати IE <10, вам потрібно буде використовувати якусь форму ActiveX. Я б уникав рекомендацій, які передбачають кодування проти Scripting.FileSystemObject або безпосереднє створення ActiveX.

У цьому випадку я мав успіх із використанням сторонніх бібліотек JS, таких як plupload, які можна налаштувати на використання елементів керування API HTML5 або Flash / Silverlight для заповнення браузерів, які їх не підтримують. Plupload має API на стороні клієнта для перевірки розміру файлу, який працює в IE <10.

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