2013-07-02 14 views
13

Fondamentalmente, voglio capire se dovrei scaricare un file usando AJAX, a seconda di quanto è grande il file.Ajax - Ottieni le dimensioni del file prima di scaricare

Immagino che questa domanda possa anche essere riformulata come: Come ottengo solo l'intestazione di una richiesta Ajax?


EDIT: ultima-rat0 nei commenti mi ha detto di due questioni che erano già state poste che, apparentemente, sono gli stessi di questo. Sono molto simili, ma entrambi vogliono jQuery. Voglio una soluzione non jQuery a questo.

+2

possibile duplicato? http://stackoverflow.com/questions/1484303/get-size-of-file-requested-via-ajax e http://stackoverflow.com/questions/1440723/find-size-of-file-behind-download- link-with-jquery –

+0

@ ultima_rat0 Grazie, per qualche motivo, non si sono mostrati nella lista di duplicati di stackexchange ... non ho idea del perché. Questo _only_ scarica l'intestazione? – MiJyn

+1

è possibile ottenere manualmente i dati di XHR-respone: http://www.w3.org/TR/XMLHttpRequest/#the-getresponseheader()-method – hungdoan

risposta

21

È possibile ottenere manualmente i dati di intestazione di risposta XHR:

http://www.w3.org/TR/XMLHttpRequest/#the-getresponseheader()-method

Questa funzione otterrà la dimensione del file dell'URL richiesto:

function get_filesize(url, callback) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("HEAD", url, true); // Notice "HEAD" instead of "GET", 
           // to get only the header 
    xhr.onreadystatechange = function() { 
     if (this.readyState == this.DONE) { 
      callback(parseInt(xhr.getResponseHeader("Content-Length"))); 
     } 
    }; 
    xhr.send(); 
} 

get_filesize("http://example.com/foo.exe", function(size) { 
    alert("The size of foo.exe is: " + size + " bytes."); 
}); 
+0

E se ho usato una variabile invece di un avviso? Perché restituiscono "indefinito"? Come posso memorizzare 'xhr.getResponseHeader (" Content-Length ")' in una variabile? –

+0

@FabioCalvosa 'xhr.open (" HEAD ", url, true);' // 'false' rende la richiesta asincrona Quindi quando si chiama tale funzione in questo modo: var myVar; get_filesize ('https://sample.com'); Avviso (myVar); // la tua variabile è 'indefinita' Ma se cambi il tuo codice in questo modo: var myVar; get_filesize ('https://sample.com', function() { alert (myVar); // la tua variabile non sarà 'indefinita' perché chiamerai un metodo 'callback' }); – hungdoan

+0

non funzionerà mai se il browser e il server eseguono la codifica gzip ... l'intestazione di lunghezza del contenuto è vietata. la cosa peggiore è che W3C/xhr proibisce l'impostazione di Accept-Encoding, eliminando così ogni speranza di soluzione alternativa al client ... molto deprimente – user3338098

0

volte testa può agire in modo diverso di quanto ottiene così suggerisco qualcosa del genere che interrompe la richiesta dopo aver ottenuto l'intestazione Content-Length:

new Promise(resolve => { 
    var xhr = new XMLHttpRequest(); 
    xhr.open('GET', '/a.bin', true); 
    xhr.onreadystatechange =() => { 
     resolve(+xhr.getResponseHeader("Content-Length")); 
     xhr.abort(); 
    }; 
    xhr.send(); 
}).then(console.log); 
Problemi correlati