Как частично загрузить удаленный файл с помощью cURL?

Возможно ли частично загрузить удаленный файл с помощью cURL? Скажем, фактический размер файла удаленного файла составляет 1000 КБ. Как загрузить только первые 500 КБ?

Related of "Как частично загрузить удаленный файл с помощью cURL?"

Вы также можете установить параметр заголовка диапазона с расширением php-curl.

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://www.spiegel.de/'); curl_setopt($ch, CURLOPT_RANGE, '0-500'); curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); curl_close($ch); echo $result; 

Но, как отмечалось ранее, если сервер не соблюдает этот заголовок, но отправляет весь файл curl, он загрузит все это. Например, http://www.php.net игнорирует заголовок. Но вы можете (дополнительно) установить обратный вызов функции записи и прервать запрос при получении большего количества данных, например

 // php 5.3+ only // use function writefn($ch, $chunk) { ... } for earlier versions $writefn = function($ch, $chunk) { static $data=''; static $limit = 500; // 500 bytes, it's only a test $len = strlen($data) + strlen($chunk); if ($len >= $limit ) { $data .= substr($chunk, 0, $limit-strlen($data)); echo strlen($data) , ' ', $data; return -1; } $data .= $chunk; return strlen($chunk); }; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://www.php.net/'); curl_setopt($ch, CURLOPT_RANGE, '0-500'); curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); curl_setopt($ch, CURLOPT_WRITEFUNCTION, $writefn); $result = curl_exec($ch); curl_close($ch); 

Получите первые 100 байт документа:

 curl -r 0-99 http://www.get.this 

из руководства

убедитесь, что у вас есть современный завиток

Это может быть ваше решение (загрузите сначала 500 КБ в файл output.txt )

 curl -r 0-511999 http://www.yourwebsite.com > output.txt 
  • а 511999500^1024-1

Спасибо за хорошее решение VolkerK. Однако мне нужно было использовать этот код как функцию, поэтому вот что я придумал. Надеюсь, это полезно для других. Основное различие заключается в использовании ($ limit, & $ datadump), поэтому предел можно передать и использовать переменную $ datadump для сравнения, чтобы иметь возможность вернуть ее в результате. Я также добавил CURLOPT_USERAGENT, потому что некоторые веб-сайты не разрешают доступ без заголовка пользовательского агента.

Проверьте http://php.net/manual/en/functions.anonymous.php

 function curl_get_contents_partial($url, $limit) { $writefn = function($ch, $chunk) use ($limit, &$datadump) { static $data = ''; $len = strlen($data) + strlen($chunk); if ($len >= $limit) { $data .= substr($chunk, 0, $limit - strlen($data)); $datadump = $data; return -1; } $data .= $chunk; return strlen($chunk); }; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); //curl_setopt($ch, CURLOPT_RANGE, '0-1000'); //not honored by many sites, maybe just remove it altogether. curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); curl_setopt($ch, CURLOPT_WRITEFUNCTION, $writefn); $data = curl_exec($ch); curl_close($ch); return $datadump; } 

Применение:
$ page = curl_get_contents_partial (' http://some.webpage.com ', 1000); // читаем первые 1000 байт
echo $ page // или делать что-либо с результатом.