2009-09-09 13 views

Odpowiedz

8

Tak. Ponieważ plik jest zdalny, jesteś całkowicie zależny od wartości nagłówka Content-Length (chyba że chcesz pobrać cały plik). Będziesz chciał curl_setopt($ch, CURLOPT_NOBODY, true) i curl_setopt($ch, CURLOPT_HEADER, true).

10

Zgaduję, że użycie curl do wysłania żądania HEAD jest fajną możliwością; coś w tym pewnie zrobić:

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

I będzie Ci:

float 3438 

ten sposób używasz żądania HEAD, a nie pobierania całego pliku - nadal, trzeba polegać na zdalny serwer wysyła prawidłowy nagłówek długości treści.


Inną opcją może myślisz o byłoby użyć filesize ... Ale to zawiedzie: dokumentacja stwierdza (cytowanie):

Od PHP 5.0.0 to, funkcja może może być również używana w niektórych opakowaniach adresów URL. Listazawiera opakowania z funk() rodziny funkcji.

I, niestety, z HTTP and HTTPS wrappers, stat() nie jest obsługiwany ...

Jeśli spróbujesz, dostaniesz błąd, tak:

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

Szkoda :-(

1

Korzystanie z żądania HEAD i sprawdzanie pod kątem Content-Length jest standardowym sposobem wykonania tej operacji, ale nie można na nim polegać w ogóle, ponieważ serwer może nie obsługiwać tego. Nagłówekjest opcjonalny, a ponadto serwer może nawet nie implementować metody HEAD. Jeśli wiesz, który serwer próbujesz, możesz sprawdzić, czy działa, ale jako ogólne rozwiązanie nie jest to punktor kuloodporny.

+0

Tak, z tego: http: // php. net/manual/en/function.get-headers.php – Merlinox

1

Jeśli nie potrzebują kuloodporną rozwiązanie można po prostu zrobić:

strlen(file_get_contents($url)); 
+4

To zadziała, ale najpierw pobierze plik. Prawdopodobnie chce poznać rozmiar przed pobraniem go przez sieć. – troelskn

49

Najlepszym rozwiązaniem, które kieruje się zasadą KISS

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

Zdecydowanie najlepsza odpowiedź. Ładnie wykonane. –

+2

To polecenie nie zwraca mi klucza "długość treści", tutaj jest tablica, którą zwraca: ''connection' => string 'close' (length = 5) 'date' => string 'wt., 03 czerwca 2014 20:55:55 GMT '(długość = 29) ' serwer '=> ciąg' Microsoft-IIS/6.0 '(długość = 17) ' x-powered-by '=> ciąg' ASP.NET "(długość = 7) 'x-aspnet-version' => ciąg '4.0.30319' (długość = 9) 'kontrola pamięci podręcznej' => ciąg 'prywatny' (długość = 7) 'typ zawartości '=> string' image/gif'' –

+2

Szybkie pytanie, dlaczego potrzebuje array_change_key_case? – mario

Powiązane problemy