Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Вы также можете установить параметр заголовка диапазона с расширением 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 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);

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

Спасибо за хорошее решение VolkerK. Однако мне нужно было использовать этот код как функцию, поэтому вот что я придумал. Надеюсь, это полезно для других. Основное отличие: use ($ 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//или делать что-либо с результатом.