2009-09-09 55 views

回答

8

是的。由於該文件是遠程文件,因此您完全依賴於Content-Length標題的值(除非要下載整個文件)。你會想要curl_setopt($ch, CURLOPT_NOBODY, true)curl_setopt($ch, CURLOPT_HEADER, true)

10

我猜curl發送HEAD請求是一個很好的可能性;這樣的事情可能會做:

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

而且會得到你:

float 3438 

這樣,您使用的是HEAD請求,而不是下載整個文件 - 你,依舊取決於遠程服務器發送正確的內容長度標題。


你可能會考慮將使用filesize另一種選擇......但是這將失敗:文檔指出(引用)

自PHP 5.0.0,這函數 也可以與一些URL包裝一起使用。 請參閱List of Supported Protocols/Wrappers以獲取列表 ,其中包裝程序支持stat() 功能族。

而且,不幸的是,與HTTP and HTTPS wrappersstat()不支持......

如果你嘗試,你會得到一個錯誤,像這樣:

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

太糟糕了:-(

1

使用HEAD請求並檢查Content-Length是執行此操作的標準方式,但由於服務器可能不支持它,所以一般不能依賴它。Content-Length頭是可選的,並且服務器甚至可能不實現HEAD方法。如果你知道你正在探測哪個服務器,那麼你可以測試它是否有效,但作爲一個通用的解決方案,它不是防彈的。

+0

是,這樣做的最好的解決辦法:HTTP:// PHP。 net/manual/en/function.get-headers.php – Merlinox 2012-06-01 21:28:55

1

如果你並不需要一個防彈解決方案,你可以這樣做:

strlen(file_get_contents($url)); 
+4

這會起作用,但它也會先下載文件。據推測,他想在通過網絡獲取大小之前知道大小。 – troelskn 2009-09-10 09:08:10

49

隨後KISS原則

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

迄今爲止最好的答案。做得很好。 – 2012-10-10 23:06:39

+2

這條命令不會爲我返回一個'content-length'鍵,這裏有返回的數組:''''''''''''''''''''''''''''''''''' 03 Jun 2014 20:55:55 GMT'(長度= 29) 'server'=> string'Microsoft-IIS/6.0'(l​​ength = 17) 'x-powered-by'=> string'ASP。NET''(length = 7) 'x-aspnet-version'=> string'4.0.30319'(length = 9) 'cache-control'=> string'private'(length = 7) 'content-type '=> string'image/gif'' – 2014-06-03 20:57:45

+2

快速問題,爲什麼它需要array_change_key_case? – mario 2015-03-20 13:52:05

相關問題