Самый простой способ получить размер файла удаленного файла в PHP?
Я подумывал о том, чтобы сделать запрос на голову с помощью cURL, мне было интересно, можно ли так поступить?
5 answers
Да. Поскольку файл удален, вы полностью зависите от значения заголовка Content-Length
(если только вы не хотите загрузить весь файл целиком). Вы захотите curl_setopt($ch, CURLOPT_NOBODY, true)
и curl_setopt($ch, CURLOPT_HEADER, true)
.
Лучшее решение, которое следует принципу ПОЦЕЛУЯ
$head = array_change_key_case(get_headers("http://example.com/file.ext", TRUE));
$filesize = $head['content-length'];
Я предполагаю, что использование 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
Очень жаль:-(
Использование запроса HEAD и проверка на Content-Length
- стандартный способ сделать это, но вы не можете полагаться на него в целом, так как сервер может его не поддерживать. Заголовок Content-Length
является необязательным, и, кроме того, сервер может даже не реализовать метод HEAD. Если вы знаете, какой сервер вы исследуете, вы можете проверить, работает ли он, но в качестве общего решения он не является пуленепробиваемым.
Если вам не нужно пуленепробиваемое решение, вы можете просто сделать:
strlen(file_get_contents($url));