PHP Curl скачать полный большой файл с расширением .tbz и .tbz.md5 - PullRequest
0 голосов
/ 18 октября 2011

Я использую CURL для загрузки 4 файлов с URL-адреса, для которых я должен аутентифицировать себя.и я аутентифицируюсь только с помощью CURL.Но проблема в том, что когда я загружаю данные, он загружает только 1 КБ каждого файла.Я пробовал различные методы, приведенные на SO.Но никто из них не работает для меня.Мой код CURL-PHP:

<?php

  require ('dbconfig/dbconfig.php'); //database connection.
  ini_set('display_errors', 1); 
  error_reporting(E_ALL);
  $username = "user";
  $password = "password";
  $url = "http://domain-name/contents/";

  global $ch;
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
  curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml"));
  curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1);
  $output = curl_exec($ch);
  $r = time()-(24*60*60); 
  $dateit = date("Ymd", $r);

  $file1 = "aaa".$dateit.".tbz";
  $file2 = "aaa".$dateit.".tbz.md5";
  $file3 = "bbb".$dateit.".tbz";
  $file4 = "bbb".$dateit.".tbz.md5";

  $arr = array($file1, $file2, $file3, $file4);

  for($i = 0; $i <= 3; $i++) {

    $url = "http://domain-name/content/current/".$arr[$i];

    $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();
    $fp = fopen("adminArea/folder/".$arr[$i], 'w+');

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RANGE, '0-500');
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    curl_setopt($ch, CURLOPT_WRITEFUNCTION, $writefn);
    curl_setopt($ch, CURLOPT_FILE, $fp);

    curl_exec ($ch);

  }

  fclose($fp);
  curl_close($ch);

?>

Сначала я аутентифицирую себя, затем в цикле for для всех четырех я использую curl для загрузки данных.Я тоже получил этот код curl от SO.Перепробовал много способов сделать то же самое.

Любая помощь или идея будут высоко оценены.

ОБНОВЛЕНИЕ

код работал для меня.Я добавил curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1);оба раза, во-первых, он аутентифицирует и возвращает ответ, а затем загружает файл для меня с другого URL.

 // Set cURL options
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);

// Do it
curl_exec ($ch);

curl_setopt($ch, CURLOPT_URL, $urlbase.$file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$fp = fopen("adminArea/folder/$file", 'w+');
curl_setopt($ch, CURLOPT_FILE, $fp);

// Do it
curl_exec ($ch);

// Close pointers    
fclose($fp);
curl_close($ch);

1 Ответ

0 голосов
/ 18 октября 2011

Я думаю, что проблема, скорее всего, связана с функцией записи обратного вызова. Я не могу понять, чего именно это должно было достичь, но это, безусловно, не приносит вам никакой пользы. Действительно, мне кажется, что там много кода, который не требуется для того, что вы описываете.

Попробуйте это:

<?php

  // Database connection - do you need this here? You never use it...
  require ('dbconfig/dbconfig.php');

  // While developing
  ini_set('display_errors', 1); 
  error_reporting(E_ALL);

  // The details of the destination
  $username = "user";
  $password = "password";
  $urlbase = "http://domain-name/content/current/";

  // Create the file list
  $dateit = date("Ymd", strtotime('-1 day'));
  $files = array("aaa$dateit.tbz", "aaa$dateit.tbz.md5", "bbb$dateit.tbz", "bbb$dateit.tbz.md5");

  // Loop the file list
  foreach ($files as $file) {

    // Create pointers
    $ch = curl_init($urlbase.$file);
    $fp = fopen("adminArea/folder/$file", 'w+');

    // Set cURL options
    curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
    curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FILE, $fp);

    // Do it
    curl_exec ($ch);

    // Close pointers    
    fclose($fp);
    curl_close($ch);

  }

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...