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

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

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

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

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

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

Я предполагаю, что использование 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. См. Список поддерживаемых протоколов / Wrappers для списка, в которых обертки поддерживают семейство функций 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));