1. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

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

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

  1. clayton

    clayton Гость

    Репутация:
    0
    Здравствуйте, уважаемые форумчане.
    Недавно столкнулся с написанием 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 Больной Компом Детектед

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

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

    clayton Гость

    Репутация:
    0
    file_get_contents пролетает из-за referer, в случае его отсутствия идет перенаправление на главную страницу сайта, да и проблема с эффективность остается из-за того что эта функция возвращает контент(или сам файл) в, к примеру, переменную (что означает запись в оперативную память), что очень не удобно.
    Хотелось бы подкючиться к потоку файла и производить считывание порции файла и запись его в новый файл циклически до конца файла, что возможно с помощью fopen, но как и file_get_contents пролетает.
    Вот что получается с помощью сокета:
    PHP:
      $file_stream = @fsockopen$host80$errno$errstr30 ) 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_stream4096 );
    fwrite$output_file$file_seg );
    }  

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

    typak Гость

    Репутация:
    0
    Зделай так :
    PHP:
      $file_stream = @fsockopen$host80$errno$errstr30 ) 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_stream4096 );
    fwrite$output_file$file_seg );
    }  

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

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