Ottieni la dimensione del file prima del caricamento


89

C'è un modo per scoprire la dimensione del file prima di caricare il file utilizzando AJAX / PHP in caso di modifica del file di input?




Ecco un tutorial passo passo per ottenere nome file, tipo e dimensione codepedia.info/…
Satinder singh

Risposte:


132

Per il muggito HTML

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

prova quanto segue:

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

});

Vedere la seguente discussione:

Come controllare la dimensione dell'input del file con jQuery?


1
L'array di file non è inesistente su Internet Explorer (versioni precedenti)?
Tiago César Oliveira

4
Sì, questo non funziona prima di IE 10 e ha solo un supporto parziale in Android e iOS. caniuse.com/fileapi . Se solo fosse così facile ...
styks

2
Suppongo che il risultato sia in byte?
Erdal G.

4
@ErdalG. Buona domanda! MDN manca la documentazione, ma FileList.filesè un array di Fileoggetti, che è un'estensione di Glob. E secondo le specifiche , Globinfatti , definisce la sizeproprietà come il numero di byte (0 per un file vuoto). Quindi sì, il risultato è in byte .
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();" />

Lavora su IE e FF


15
downvoted perché la risposta utilizza ActiveX. nel 2015, anche Microsoft sta abbandonando ActiveX. Sebbene fosse un suggerimento ragionevole quando fornito, consiglierei agli sviluppatori di evitarlo ora e in futuro.
scott stone

3
Mi piace questa soluzione, perché solo le versioni precedenti di IE restituiranno true per window.ActiveXObject.
Rob Breidecker

@scottstone Non capisco perché hai scartato tutte le risposte che supportano i browser legacy? Questa risposta è molto più pulita di quelle che utilizzano le impronte digitali del browser e non consiglia assolutamente a nessuno di utilizzare ActiveX.
Nicolas Bouvrette

@NicolasBouvrette - Sono d'accordo che questa risposta è molto più pulita delle altre, ma a questo punto non posso rimuovere il voto negativo. La domanda originale non chiedeva la compatibilità con le vecchie versioni di IE e questa risposta non avvisa i lettori che la maggior parte del codice è lì per supportare versioni di IE di 5 anni e oltre.
Scott Stone,

@scottstone In realtà un altro punto tangibile dal mio punto di vista sul perché non usare ActiveX è perché mostra un messaggio di avviso in IE che è un'esperienza utente orribile (spaventosa?).
Nicolas Bouvrette

13

Ecco un semplice esempio per ottenere la dimensione di un file prima del caricamento. Utilizza jQuery per rilevare ogni volta che i contenuti vengono aggiunti o modificati, ma puoi comunque ottenere files[0].sizesenza utilizzare 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>

Ecco un esempio più completo, un codice di prova per trascinare i file in FormData e caricarli tramite POST su un server. Include un semplice controllo della dimensione del file.


8

Ho avuto lo stesso problema e sembra che non abbiamo avuto una soluzione accurata. Spero che questo possa aiutare altre persone.

Dopo aver impiegato del tempo ad esplorare, ho finalmente trovato la risposta. Questo è il mio codice per allegare file con jQuery:

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

Questo è solo il codice di esempio per ottenere la dimensione del file. Se vuoi fare altre cose, sentiti libero di cambiare il codice per soddisfare le tue esigenze.


Mi piace perché non ha bisogno di essere inserito nell'evento di cambiamento come la soluzione più popolare. E mi piace anche il fatto che mi hai dato il permesso di cambiare il codice per soddisfare le mie esigenze :)
Matt

8

La migliore soluzione funziona su tutti i browser;)

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

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

AGGIORNAMENTO: useremo questa funzione per verificare se è il browser IE o meno

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
downvoted perché la risposta utilizza ActiveX. nel 2015, anche Microsoft sta abbandonando ActiveX. Sebbene sia stato un suggerimento ragionevole quando fornito, consiglierei agli sviluppatori di evitarlo ora e in futuro. -
scott stone

1
$ .browser è stato rimosso da jQuery nella versione 1.9 (deprecata dalla v 1.3).
Silvio Delgado

2
@scottstone questo è per la compatibilità all'indietro e non è vero Microsoft non abdonerà ActiveX, è molto usato in molte cose ed ecco la prova computerworld.com/article/2481188/internet/…
ucefkh

@SilvioDelgado Modificato e aggiornato hanno rimosso $ .browser in un plugin, quindi avremo bisogno solo di un piccolo test per il browser IE (funziona con tutte le versioni)
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

I browser con supporto HTML5 hanno proprietà file per il tipo di input. Questo ovviamente non funzionerà nelle versioni precedenti di 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

La soluzione di ucefkh ha funzionato meglio, ma poiché $ .browser era deprecato in jQuery 1.91, è stato necessario modificare per utilizzare 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

devi fare una richiesta ajax HEAD per ottenere la dimensione del file. con jquery è qualcosa del genere

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

Ma se lo fai, l'input del file verrà cancellato (vuoto) ?? Puoi fare un esempio grazie
DeLe

1

Si prega di non utilizzare in ActiveXquanto è probabile che visualizzi un messaggio di avviso spaventoso in Internet Explorer e spaventi i tuoi utenti.

Avviso ActiveX

Se qualcuno vuole implementare questo controllo, dovrebbe fare affidamento solo sull'oggetto FileList disponibile nei browser moderni e fare affidamento sui controlli lato server solo per i browser meno recenti ( miglioramento progressivo ).

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

È possibile utilizzare la funzione di dimensione file PHP. Durante il caricamento usando ajax, controlla prima la dimensione del file facendo una richiesta una richiesta ajax allo script php che controlla la dimensione del file e restituisce il valore.



0

Personalmente, direi la risposta di Web World è la migliore oggi, dati gli standard HTML. Se è necessario supportare IE <10, sarà necessario utilizzare una qualche forma di ActiveX. Eviterei i consigli che implicano la codifica contro Scripting.FileSystemObject o l'istanza diretta di ActiveX.

In questo caso, ho avuto successo utilizzando librerie JS di terze parti come plupload che possono essere configurate per utilizzare API HTML5 o controlli Flash / Silverlight per eseguire il backfill dei browser che non li supportano. Plupload ha un'API lato client per il controllo della dimensione del file che funziona in IE <10.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.