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

med*_*iev 15 php curl http

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

sof*_*eak 56

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

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

  • 这个命令不会为我返回一个键'content-length',这里有它返回的数组:`'connection'=> string'close'(length = 5)'date'=> string'Tue,03 Jun 2014 20:55:55 GMT'(长度= 29)'服务器'=>字符串'Microsoft-IIS/6.0'(长度= 17)'x-powered-by'=>字符串'ASP.NET'(长度= 7) 'x-aspnet-version'=> string'4.0.30319'(length = 9)'cache-control'=> string'private'(length = 7)'content-type'=> string'image/gif'` (2认同)
  • 快问,为什么需要array_change_key_case? (2认同)

Pas*_*TIN 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);
Run Code Online (Sandbox Code Playgroud)

并会得到你:

float 3438
Run Code Online (Sandbox Code Playgroud)

这样,您正在使用HEAD请求,而不是下载整个文件 - 仍然依赖于远程服务器发送正确的Content-length头.


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

从PHP 5.0.0开始,此函数也可以与某些URL包装器一起使用.有关哪些包装器支持stat()系列功能的列表,请参阅支持的协议/包装器列表.

而且,不幸的是,HTTP和HTTPS包装,stat()不支持...

如果你尝试,你会收到一个错误,如下所示:

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

太糟糕了 :-(


Ann*_*rom 9

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