Загрузка файла с помощью Curl

Тема в разделе "PHP программирование", создана пользователем clayton, 16 фев 2011.

  1. clayton

    clayton Гость

    Здравствуйте, уважаемые форумчане.
    Недавно столкнулся с написанием php-скрипта для парсинга и скачивания файлов. Так как я в скачивании файлов средствами php не силен, решил воспользоваться библиотекой cURL:
    Код (PHP):
       
    $curl = curl_init( $URL );
    $curl_options = array(
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_REFERER     => "http://referer.html",
    CURLOPT_USERAGENT    => "Opera/10.00 (Windows NT 6.0; U; ru)",
    CURLOPT_HEADER       => 1,
    CURLOPT_TIMEOUT     => 240
    );
    curl_setopt_array( $curl, $curl_options );

    file_put_contents( "outfile", curl_exec( $curl ) );
    Для скачивания требуется передать заголовок "Referer" поэтому и решил воспользоваться cURL. Но данный подход не удобный из-за того что если файл будет больших размеров, а cURL его сначала загружает в память, будет довольно не эффективно.
    Возможно ли реализовать как-то загрузку файла порциями?
    Пытался с помощью сокетов, но там довольно сложно и поэтому я не совсем разобрался.
    Возможно необходимо копать в сторону заголовка "Range" или можно что-то сделать с помощью cURL?
     
  2. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.474
    Симпатии:
    27
    Качать файлы курлом - в мусорку.

    Качать файл - лучше всего через фтп. Если нету такой возможности, то, возможно, вам подойдет просто через file_get_contents() получить удаленный файл? Но это может быть отключено в пхп-ини. В таком случае - да, сокетами. А что сложного? Пишите, поможем.
     
  3. clayton

    clayton Гость

    file_get_contents пролетает из-за referer, в случае его отсутствия идет перенаправление на главную страницу сайта, да и проблема с эффективность остается из-за того что эта функция возвращает контент(или сам файл) в, к примеру, переменную (что означает запись в оперативную память), что очень не удобно.
    Хотелось бы подкючиться к потоку файла и производить считывание порции файла и запись его в новый файл циклически до конца файла, что возможно с помощью fopen, но как и file_get_contents пролетает.
    Вот что получается с помощью сокета:
    Код (PHP):
      $file_stream = @fsockopen( $host, 80, $errno, $errstr, 30 ) or die("<h2>$errno : $errstr</h2>");

    $request = "GET " . $root . " HTTP/1.1\r\n";
    $request .= "Host: " . $host . "\r\n";
    $request .= "Accept:*/*\r\n";
    $request .= "Referer: " . $referer . "\r\n";
    $request .= "User-agent: Opera/10.00 (Windows NT 6.0; U; ru)\r\n";
    $request .= "Connection: Close\r\n\r\n";

    fwrite( $file_stream, $request );

    $output_file = fopen( "outfile", "w" );

    while ( ! feof( $file_stream ) )
    {
    $file_seg = fread( $file_stream, 4096 );
    fwrite( $output_file, $file_seg );
    }  

    fclose( $file_stream );
    fclose( $output_file );
    Но данный код не считует файл, доходя до условия while ( ! feof( $file_stream ) ), сразу возвращается TRUE, из-за чего итерация не происходить. Возможно какае-то ошибка?
     
  4. typak

    typak Гость

    Зделай так :
    Код (PHP):
      $file_stream = @fsockopen( $host, 80, $errno, $errstr, 30 ) or die("<h2>$errno : $errstr</h2>");

    $request = "GET " . $root . " HTTP/1.1\r\n";
    $request .= "Host: " . $host . "\r\n";
    $request .= "Accept:*/*\r\n";
    $request .= "Referer: " . "". "\r\n";
    $request .= "User-agent: Opera/10.00 (Windows NT 6.0; U; ru)\r\n";
    $request .= "Connection: Close\r\n\r\n";

    fwrite( $file_stream, $request );

    $output_file = fopen( "outfile.txt", "w" );

    while ( ! feof( $file_stream ) )
    {
    $file_seg = fread( $file_stream, 4096 );
    fwrite( $output_file, $file_seg );
    }  

    fclose( $file_stream );
    fclose( $output_file );
    Всё сщитает
     
Загрузка...

Поделиться этой страницей