Yüklemeden önce dosya boyutunu alın


91

Giriş dosyası değişiklik durumunda AJAX / PHP kullanarak dosyayı yüklemeden önce dosya boyutunu bulmanın bir yolu var mı?




Dosya adı, türü ve boyutunu alma konusunda adım adım öğretici kodepedia.info/…
Satinder singh

Yanıtlar:


134

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

});

Aşağıdaki konuya bakın:

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


1
Dosyalar dizisi internet explorer'da (eski sürümler) mevcut değil mi?
Tiago César Oliveira

4
Evet, bu IE 10 öncesi çalışmaz ve yalnızca android ve ios'ta kısmi destek vardır. caniuse.com/fileapi . Keşke bu kadar kolay
olsaydı

2
Sanırım sonuç bayt cinsinden mi?
Erdal G.

4
@ErdalG. İyi soru! MDN belgelerde eksiktir , ancak nesnelerin FileList.filesbir dizisi benzeri File, ki bu da Glob. Ve spec göre , Globgerçekten de tanımlar sizesayısı özelliği bayt (boş bir dosya için 0). Yani evet, sonuç bayt cinsindendir .
John Weisz

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 ve FF üzerinde çalışın


15
yanıt ActiveX kullandığı için olumsuz oy verildi. 2015'te Microsoft bile ActiveX'i terk ediyor. Verildiğinde makul bir öneri olsa da, geliştiricilerin şimdi ve gelecekte bundan kaçınmasını tavsiye ederim.
scott stone

3
Bu çözümü beğendim, çünkü yalnızca eski IE sürümleri window.ActiveXObject için true değerini döndürecektir.
Rob Breidecker

@scottstone Eski tarayıcıları destekleyen tüm yanıtları neden reddettiniz anlamıyorum? Bu yanıt, tarayıcı parmak izlerini kullananlardan çok daha temizdir ve hiçbir şekilde ActiveX'i kimseye tavsiye etmeyin.
Nicolas Bouvrette

@NicolasBouvrette - Bu cevabın diğerlerinden çok daha temiz olduğunu kabul ediyorum, ancak bu noktada olumsuz oyu kaldıramıyorum. Orijinal soru, IE'nin eski sürümleriyle uyumluluk istemiyordu ve bu yanıt, okuyuculara kodun çoğunun IE'nin 5+ yıllık sürümlerini desteklemek için orada olduğunu önermiyor.
scott stone

@scottstone ActiveX'in neden kullanılmayacağına dair benim görüşüme göre bir başka somut nokta, IE'de korkunç (korkutucu?) bir kullanıcı deneyimi olan bir uyarı mesajı görüntülemesidir.
Nicolas Bouvrette

13

Yüklemeden önce dosyanın boyutunu almanın basit bir örneğini burada bulabilirsiniz. İçerik eklendiğinde veya değiştirildiğinde algılamak için jQuery kullanıyor, ancak yine de files[0].sizejQuery kullanmadan alabilirsiniz .

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

İşte daha eksiksiz bir örnek, dosyaları FormData'ya Sürükle ve Bırak ve POST aracılığıyla bir sunucuya yüklemek için bazı konsept kodu kanıtı . Dosya boyutu için basit bir kontrol içerir.


8

Aynı sorunu yaşadım ve doğru bir çözüm bulamadık gibi görünüyor. Umarım bu diğer insanlara yardımcı olabilir.

Etrafı keşfetmeye zaman ayırdıktan sonra, sonunda cevabı buldum. Bu, jQuery ile dosya eklemek için kodum:

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

Bu sadece dosya boyutunu elde etmek için örnek koddur. Başka şeyler yapmak istiyorsanız, ihtiyaçlarınızı karşılamak için kodu değiştirmekten çekinmeyin.


Bunu beğendim çünkü en popüler çözüm gibi değişim olayına eklenmesine gerek yok. Ayrıca, ihtiyaçlarımı karşılamak için kodu değiştirmem için bana izin vermiş olman da hoşuma gidiyor :)
Matta

8

Tüm tarayıcılarda çalışan en iyi çözüm;)

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

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

GÜNCELLEME: Bu işlevi IE tarayıcısı olup olmadığını kontrol etmek için kullanacağız

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
yanıt ActiveX kullandığı için olumsuz oy verildi. 2015'te Microsoft bile ActiveX'i terk ediyor. Verildiğinde makul bir öneri olsa da, geliştiricilerin şimdi ve gelecekte bundan kaçınmasını tavsiye ederim. -
scott stone

1
$ .browser, 1.9 sürümünde jQuery'den kaldırılmıştır (1.3 sürümünden beri kullanımdan kaldırılmıştır).
Silvio Delgado

2
@scottstone bu geriye dönük uyumluluk içindir ve bu doğru değil Microsoft, ActiveX'i bir çok şeyde çok fazla kullanmayacaktır ve işte kanıtı computerworld.com/article/2481188/internet/…
ucefkh

@SilvioDelgado $ .browser'ı bir eklenti olarak değiştirip güncellediler, bu nedenle IE tarayıcısı için sadece küçük bir teste ihtiyacımız olacak (tüm sürümlerle çalışır)
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 desteğine sahip tarayıcılar, girdi türü için files özelliğine sahiptir. Bu elbette eski IE sürümlerinde çalışmayacaktır.

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'nin çözümü en iyi sonucu verdi, ancak $ .browser jQuery 1.91'de kullanımdan kaldırıldığı için navigator.userAgent'ı kullanmak için değiştirmek zorunda kaldı:

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

dosya boyutunu almak için bir ajax HEAD isteği yapmanız gerekir. jquery ile bunun gibi bir şey

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

Ama eğer bu dosya girdisi temizlenir (boş) ?? Örnek bir teşekkür edebilir misin
DeLe

1

Lütfen ActiveX, Internet Explorer'da korkutucu bir uyarı mesajı görüntüleyeceği ve kullanıcılarınızı korkutacağı için kullanmayın.

ActiveX uyarısı

Herhangi biri bu denetimi uygulamak isterse, yalnızca modern tarayıcılarda bulunan FileList nesnesine ve yalnızca eski tarayıcılar için sunucu tarafı denetimlerine güvenmelidir ( aşamalı geliştirme ).

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 dosya boyutu işlevini kullanabilirsiniz. Ajax kullanarak yükleme sırasında, lütfen dosya boyutunu kontrol eden ve değeri döndüren php betiğine bir ajax isteği göndererek dosya boyutunu kontrol edin.



0

Kişisel olarak, HTML standartları göz önüne alındığında Web World'ün cevabının bugün en iyisi olduğunu söyleyebilirim . IE <10'u desteklemeniz gerekiyorsa, bir çeşit ActiveX kullanmanız gerekecektir. Scripting.FileSystemObject'e karşı kodlamayı veya ActiveX'i doğrudan başlatmayı içeren önerilerden kaçınırdım.

Bu durumda, bunları desteklemeyen tarayıcıları doldurmak için HTML5 apis veya Flash / Silverlight kontrollerini kullanacak şekilde yapılandırılabilen plupload gibi 3. taraf JS kitaplıklarını kullanarak başarılı oldum . Plupload, IE <10'da çalışan dosya boyutunu kontrol etmek için istemci tarafında bir API'ye sahiptir.

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.