Самый простой способ получить размер файла удаленного файла в PHP?


Я подумывал о том, чтобы сделать запрос на голову с помощью cURL, мне было интересно, можно ли так поступить?

Author: j0k, 2009-09-09

5 answers

Да. Поскольку файл удален, вы полностью зависите от значения заголовка Content-Length (если только вы не хотите загрузить весь файл целиком). Вы захотите curl_setopt($ch, CURLOPT_NOBODY, true) и curl_setopt($ch, CURLOPT_HEADER, true).

 8
Author: Annika Backstrom, 2009-09-09 18:10:04

Лучшее решение, которое следует принципу ПОЦЕЛУЯ

$head = array_change_key_case(get_headers("http://example.com/file.ext", TRUE));
$filesize = $head['content-length'];
 51
Author: softwarefreak, 2012-09-03 21:57:34

Я предполагаю, что использование curl для отправки запроса на ГОЛОВУ - хорошая возможность; что-то вроде этого, вероятно, подойдет:

$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, а не загружаете весь файл целиком - тем не менее, вы зависите от того, отправит ли удаленный сервер правильный заголовок длины содержимого.


Другой вариант, о котором вы могли бы подумать, - это использовать filesize... Но это не сработает: в документации указано (цитирование) :

Начиная с PHP 5.0.0, эта функция также может использоваться с некоторыми оболочками URL. См. Список поддерживаемых Протоколы/оболочки для перечисления того, какие оболочки поддерживают stat() семейство функциональных возможностей.

И, к сожалению, с оболочками HTTP и HTTPS, stat() не поддерживается...

Если вы попытаетесь, вы получите сообщение об ошибке, например:

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

Очень жаль:-(

 10
Author: Pascal MARTIN, 2009-09-09 18:10:12

Использование запроса HEAD и проверка на Content-Length - стандартный способ сделать это, но вы не можете полагаться на него в целом, так как сервер может его не поддерживать. Заголовок Content-Length является необязательным, и, кроме того, сервер может даже не реализовать метод HEAD. Если вы знаете, какой сервер вы исследуете, вы можете проверить, работает ли он, но в качестве общего решения он не является пуленепробиваемым.

 1
Author: troelskn, 2009-09-09 18:31:26

Если вам не нужно пуленепробиваемое решение, вы можете просто сделать:

strlen(file_get_contents($url));
 1
Author: Alix Axel, 2009-09-09 23:55:50