2009-09-09 22 views

cevap

8

Evet. Dosya uzak olduğu için, Content-Length başlığının değerine tamamen bağımlısınız (dosyanın tamamını indirmek istemediğiniz sürece). curl_setopt($ch, CURLOPT_NOBODY, true) ve curl_setopt($ch, CURLOPT_HEADER, true)'u isteyeceksiniz.

10

HEAD isteği göndermek için curl kullanmanın güzel bir olasılık olduğunu tahmin ediyorum;

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://sstatic.net/so/img/logo.png'); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_exec($ch); 
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); 
var_dump($size); 

Ve alacak: Böyle bir şey muhtemelen yapacağını

float 3438 

Eğer bir HEAD isteği kullanarak ve bütün dosyayı indirirken değildir, Bu şekilde - yine sen bağlıdır uzak sunucu doğru İçerik uzunluğu üstbilgisi gönderir.


yaklaşık filesize kullanmak olacaktır düşünebilir Başka bir seçenek ... Ama bu başarısız olur: dokümantasyon (alıntı) devletler: PHP 5.0.0 itibariyle

, bu Bazı URL sarmalayıcılarda işlevi de kullanılabilir. listelerine ait listelerine ait List of Supported Protocols/Wrappers10 numaralı başvuruya bakın; bu paketler, stat() işlev ailesini destekler. Eğer denerseniz

maalesef HTTP and HTTPS wrappers ile stat() desteklenmez

Ve ...

, böyle bir hata alırsınız:

Warning: filesize() [function.filesize]: stat failed 
    for http://sstatic.net/so/img/logo.png 

Çok kötü :-(

1

HEAD isteği kullanma ve Content-Length kontrol yapmak standart bir yoludur, ancak sunucu bunu desteklemiyor olabilir beri, genel olarak buna güvenemez. Content-Length başlığı isteğe bağlıdır ve ayrıca sunucu HEAD yöntemini bile uygulayamayabilir. Hangi sunucuyu araştırdığınızı biliyorsanız, işe yarayıp yaramadığını test edebilirsiniz, ancak genel bir çözüm olarak kurşun geçirmez değildir. Eğer yapabilirsiniz kurşun geçirmez bir çözüm gerek yoksa

+0

evet şu iyi çözüm: http: // php. net/manual/tr/function.get-headers.php – Merlinox

1

sadece yapın:

strlen(file_get_contents($url)); 
+4

Bu işe yarayacak, ancak önce dosyayı da indirecek. Muhtemelen, ağ üzerinden getirmeden önce boyutunu bilmek istiyor. – troelskn

49

bununla KISS prensibini

$head = array_change_key_case(get_headers("http://example.com/file.ext", TRUE)); 
$filesize = $head['content-length']; 
+8

Şimdiye kadar en iyi cevap. Güzel bitti. –

+2

Bu komut benim için bir 'içerik uzunluğu' anahtarını döndürmez, burada döndürdüğü dizi var: ''connection' => string 'close' (uzunluk = 5) 'date' => string 'Tue, 03 Haz 2014 20:55:55 GMT '(uzunluk = 29) ' sunucu '=>' Microsoft-IIS/6.0 'dizesi' (uzunluk = 17) 'x-powered-by' => string 'ASP.NET '(uzunluk = 7) ' x-aspnet sürümü '=> dize' 4.0.30319 '(uzunluk = 9) ' önbellek denetimi '=> dize' özel '(uzunluk = 7) ' içerik türü '=> string' image/gif ' –

+2

Hızlı soru, neden array_change_key_case? – mario

İlgili konular