2013-07-02 20 views
13

Temelde, dosyaların ne kadar büyük olduğuna bağlı olarak AJAX kullanarak bir dosya indirip indirmemem gerektiğini öğrenmek istiyorum.Ajax - Dosyanın boyutuna bakmadan önce dosyayı indirebilmeniz için önce

Sanırım bu soru şu şekilde de yeniden yorumlanabilir: Ajax isteğinin yalnızca başlığını nasıl alabilirim?


DÜZENLEME: ultima-rat0 yorumlarla zaten görünüşte bu bir aynı olduğunu istendiğini iki sorudan söyledi. Çok benzerler, ama ikisi de jQuery istiyorlar. Bunun için jQuery olmayan bir çözüm istiyorum.

+2

Olası çift mi? http://stackoverflow.com/questions/1484303/get-size-of-file-requested-via-ajax ve http://stackoverflow.com/questions/1440723/find-size-of-file-behind-download- link-with-jquery –

+0

@ ultima_rat0 Teşekkürler, bir nedenden ötürü, stackexchange'in çiftleri listesinde görünmediler ... neden olmasın. Bu başlık _only_ indiriliyor mu? – MiJyn

+1

XHR-respone verilerini manuel olarak alabilirsiniz: http://www.w3.org/TR/XMLHttpRequest/#the-getresponseheader()-method – hungdoan

cevap

21

el XHR yanıt başlığını verilerini elde edebilirsiniz:

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

Ve uyarı yerine bir değişken kullansaydım? Neden 'tanımlanmamış' dönüyorlar? Bir değişkene xhr.getResponseHeader ("Content-Length") 'i nasıl kaydedebilirim? –

+0

@FabioCalvosa 'xhr.open (" HEAD ", url, true);' // 'false 'isteği eşzamansız hale getirir Bu işlevi şu şekilde çağırdığınızda: var myVar; get_filesize ('https://sample.com'); alert (myVar); // değişkeni 'undefined' Ancak kodunuzu şöyle değiştirirseniz: var myVar; get_filesize ('https://sample.com', function() { alert (myVar); // değişkeniniz 'undefined' olmayacaktır, 'geri arama' yöntemini çağırmanıza sebep olabilir ' }); – hungdoan

+0

tarayıcı ve sunucu gzip kodlaması yapıyorsa, içerik uzunluğu üstbilgisinin yasaklanması durumunda bu asla çalışmaz. Daha da kötüsü, W3C/xhr, Kabul-Kodlama ayarını yasaklar, böylece bir istemci tarafındaki geçici çözümün tüm umutlarını ortadan kaldırır. – user3338098

0

Bazen BAŞ ı önermek böylece GET farklı bir şekilde hareket edebilir: Bu fonksiyon istenen URL dosya boyutu alacak

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

Content-Length header'dan sonra isteği iptal eden bir şey var:

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