在PHP中获取远程文件的文件大小的最简单方法?

时间:2009-09-09 18:03:10

标签: php http curl

我在考虑用cURL做头部请求,想知道这是不是要走了?

5 个答案:

答案 0 :(得分:53)

遵循KISS原则的最佳解决方案

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

答案 1 :(得分:11)

我猜测使用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请求,而不是下载整个文件 - 仍然依赖于远程服务器发送正确的Content-length头。


您可能会想到的另一个选择是使用filesize ...但这将失败:文档说明(引用)

  

从PHP 5.0.0开始,此功能可以   也可以与一些URL包装器一起使用。   有关列表,请参阅List of Supported Protocols/Wrappers   其中包装器支持stat()   功能族。

而且,遗憾的是,HTTP and HTTPS wrappers {}不支持stat() ...

如果您尝试,则会收到错误,如下所示:

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

太糟糕了: - (

答案 2 :(得分:9)

是。由于文件是远程的,因此您完全依赖于Content-Length标头的值(除非您要下载整个文件)。您需要curl_setopt($ch, CURLOPT_NOBODY, true)curl_setopt($ch, CURLOPT_HEADER, true)

答案 3 :(得分:1)

使用HEAD请求并检查Content-Length是执行此操作的标准方法,但您通常不能依赖它,因为服务器可能不支持它。 Content-Length标头是可选的,并且服务器甚至可能甚至不实现HEAD方法。如果您知道正在探测哪个服务器,那么您可以测试它是否有效,但作为一般解决方案,它不是防弹的。

答案 4 :(得分:1)

如果您不需要防弹解决方案,您可以这样做:

strlen(file_get_contents($url));