Определение размера удаленного файла.

При определении размера удаленного файла большое значение имеет, то, какой потенциальный объем имеет файл.

Можно выделить следующие задачи определения размера удаленного файла:

1. Определение размера небольшого удаленного файла (html, php и т.п.)
2. Определение размера большого удаленного файла (zip, rar, mp3 и т.п.)

Определение размера небольшого удаленного файла

<?php

$filename = "http://www.webobzor.net/index.php";
$fh = fopen($filename, "r");
while(($str = fread($fh, 1024)) != null) $fsize += strlen($str);

echo "Размер файла: ".$fsize;

?>

Открываем файл $filename, читаем с него данные fread по 1024 байта, до тех пор, пока эти данные не равны нулю (null). Одновременно определяем длину полученных данных strlen и их сумму $fsize.

Определение размера большого удаленного файла

Как вы уже догадались, метод, описанный выше не подходит для больших файлов, так как при этом что бы получить размер файла его необходимо было бы полностью прочитать, а это равнозначно его скачиванию на локальный компьютер. Поэтому для удаленных файлов, имеющий большой размер, используется другой подход, основанный на чтении мета тегов:

<?php

function fsize($path)
{
$fp = fopen($path,"r");
$inf = stream_get_meta_data($fp);
fclose($fp);
foreach($inf["wrapper_data"] as $v)
if (stristr($v,"content-length"))
{
$v = explode(":",$v);
return trim($v[1]);
}
}

$filesize = "http://www.res.goldpages.com.ru/downloads/icons/karbon.zip";
echo fsize($filesize);

?>

В данной ситуации читаются данные не файла, а мета тегов, которые возвращаются при его открытии. При этом функция stream_get_meta_data возвращает массив данных, в котором содержатся сведения о файле, в том числе значение размера файла:

HTTP/1.1 200 OK
Date: Fri, 20 Oct 2006 09:31:16 GMT
Server: Apache/1.3.37 (Unix) FrontPage/5.0.2.2623 PHP/4.4.4 with Suhosin-Patch mod_ssl/2.8.28 OpenSSL/0.9.7d-p1
Last-Modified: Thu, 12 Oct 2006 15:07:41 GMT
ETag: "61a0dc-54779-452e5a3d"
Accept-Ranges: bytes
Content-Length: 345977
Connection: close

Остается лишь найти тег Content-Length (размер файла) и считать данные из строки.