Открываем файл $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]); } }
В данной ситуации читаются данные не файла, а мета тегов, которые возвращаются при его открытии. При этом функция 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 (размер файла) и считать данные из строки.