PHP:用strlen获取远程文件大小? (HTML)

时间:2010-07-15 01:19:08

标签: php filesize strlen

我正在查看fsockopen和诸如此类的PHP文档,他们说你不能在远程文件上使用filesize()而不用ftell或其他东西做一些疯狂的事情(不确定他们究竟说的是什么),但我有一个好好想一想怎么做:

$file = file_get_contents("http://www.google.com");
$filesize = mb_strlen($file) / 1000; //KBs, mb_* in case file contains unicode

这会是一个好方法吗?它在当时看起来如此简单和好用,只是想知道如果这可能会遇到问题或者不是真正的文件大小。

我只想通过非二进制的方式在文本(网站)上使用它。

3 个答案:

答案 0 :(得分:5)

这个答案需要PHP5和cUrl。它首先检查标题。如果未指定Content-Length,则使用cUrl下载并检查大小(文件不会保存在任何地方 - 只是暂时存储在内存中)。

<?php
echo get_remote_size("http://www.google.com/");

function get_remote_size($url) {
    $headers = get_headers($url, 1);
    if (isset($headers['Content-Length'])) return $headers['Content-Length'];
    if (isset($headers['Content-length'])) return $headers['Content-length'];

    $c = curl_init();
    curl_setopt_array($c, array(
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => array('User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3'),
        ));
    curl_exec($c);
    return curl_getinfo($c, CURLINFO_SIZE_DOWNLOAD);
}
?>

答案 1 :(得分:3)

您应该查看get_headers()函数。它将从HTTP请求返回HTTP标头的哈希值。 Content-length标题可以更好地判断实际内容的大小(如果存在的话)。

话虽如此,您确实应该使用curlstreams来执行HEAD请求而不是GET。应该存在Content-length,这可以节省转移费用。它会更快,更准确。

答案 2 :(得分:0)

它将获取整个文件,然后从检索到的数据中计算filesize(而不是字符串长度)。通常,filesize可以直接从文件系统告诉文件大小,而无需先读取整个文件。

所以这会相当慢,并且每次都能获取整个文件,然后才能检索文件大小(字符串长度