it-swarm.com.ru

Получить размер файла перед загрузкой

Есть ли способ узнать размер файла перед его загрузкой, используя AJAX/PHP в событии изменения входного файла?

77
Nisanth Kumar

Для 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?

118
Brij
<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

14
Behnam Bakhshi

Вот простой пример получения размера файла перед загрузкой. Он использует 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 на сервер. Он включает в себя простую проверку размера файла.

12
jaggedsoft

У меня была та же проблема, и, похоже, у нас не было точного решения. Надеюсь, что это может помочь другим людям.

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

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

Это просто пример кода для получения размера файла. Если вы хотите заняться другими делами, смело меняйте код, чтобы удовлетворить ваши потребности.

7
Hoang Le

Лучшее решение, работающее на всех браузерах;)

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

UPDATE: Мы будем использовать эту функцию, чтобы проверить, является ли он браузером 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;
}
6
ucefkh

Браузеры с поддержкой HTML5 имеют свойство files для типа ввода. Это, конечно, не будет работать в более старых 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
Sandeep G

$(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>

2
vishay hard

вам нужно сделать ajax запрос HEAD, чтобы получить размер файла. с JQuery это что-то вроде этого

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

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

 ActiveX warning

Если кто-то хочет реализовать эту проверку, он должен полагаться только на объект 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;
}
1
Nicolas Bouvrette

решение 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
Mike

Вы можете использовать HTML5 File API: http://www.html5rocks.com/en/tutorials/file/dndfiles/

Однако у вас всегда должен быть запасной вариант для PHP (или любого другого используемого вами языка бэкэнда) для старых браузеров.

0
José P. Airosa

Лично я бы сказал ответ Web World является лучшим на сегодняшний день, учитывая стандарты HTML. Если вам нужно поддерживать IE <10, вам нужно будет использовать некоторую форму ActiveX. Я бы избегал рекомендаций, которые включают кодирование для Scripting.FileSystemObject или создание экземпляров ActiveX напрямую. 

В этом случае я успешно использовал сторонние библиотеки JS, такие как plupload , которые можно настроить на использование HTML5 apis или элементов управления Flash/Silverlight для обратной засыпки браузеров, которые их не поддерживают. Plupload имеет клиентский API для проверки размера файла, который работает в IE <10.

0
scott stone

Вы можете использовать функцию PHP fileize. Во время загрузки с использованием ajax, пожалуйста, сначала проверьте размер файла, сделав запрос ajax-запрос к php-скрипту, который проверяет размер файла и возвращает значение.

0
rechie