PHP uzaktan dosya dosya boyutu kapmak için kolay yolu?

5 Cevap php

Ben, cURL ile bir kafa isteği yapmayı düşünüyordum bu gitmek için yol olup olmadığını merak?

5 Cevap

Evet. Dosya uzaktan olduğundan (Eğer tüm dosyayı indirmek istediğiniz sürece), size Content-Length başlığının değerine tamamen bağımlı konum. Sen curl_setopt($ch, CURLOPT_NOBODY, true) ve curl_setopt($ch, CURLOPT_HEADER, true) isteyeceksiniz.

KISS prensibi takip iyi çözüm

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

Ben bir HEAD isteği güzel bir olasılık göndermek Kıvrılmaları kullanarak tahmin ediyorum; Böyle bir şey muhtemelen yapacağını:

$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 seni alacak:

float 3438

Bu şekilde, bir HEAD isteği kullanarak, ve tüm dosya indirirken değil - yine de, doğru bir içerik-uzunluk başlığı göndermek uzak sunucuya bağlıdır.


Another option you might think about would be to use filesize... But this will fail : the documentation states (quoting) :

As of PHP 5.0.0, this function can also be used with some URL wrappers. Refer to List of Supported Protocols/Wrappers for a listing of which wrappers support stat() family of functionality.

Ve, ne yazık ki, HTTP and HTTPS wrappers ile stat() desteklenmez ...

Eğer denerseniz, bu gibi bir hata alırsınız:

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

Çok kötü :-(

HEAD isteği kullanma ve kontrol Content-Length bunu yapmak için standart bir yoldur, ancak sunucu bunu desteklemiyor olabilir bu yana, genel olarak ona güvenemez. Content-Length başlığı isteğe bağlıdır, ve sunucu bile HEAD metodunu uygulamak olmayabilir ilerletmek. Eğer sondalama olduğunuz sunucu biliyorsanız, o zaman çalışır eğer test edebilirsiniz, ama genel bir çözüm gibi kurşun geçirmez değildir.

Bir kurşun çözüm gerekiyor yoksa sadece bunu yapabilirsiniz:

strlen(file_get_contents($url));