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

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

Ответы

Ответ 1

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

Ответ 2

Лучшее решение, которое следует принципу KISS

$head = array_change_key_case(get_headers("http://example.com/file.ext", TRUE));
$filesize = $head['content-length'];

Ответ 3

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

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


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

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

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

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

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

Слишком плохо: - (

Ответ 4

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

Ответ 5

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

strlen(file_get_contents($url));