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

  • Автор темы clayton
  • Дата начала
C

clayton

Гость
#1
Здравствуйте, уважаемые форумчане.
Недавно столкнулся с написанием 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?
 

vital

Больной Компом Детектед
29.01.2006
2 432
40
codeby.net
#2
Качать файлы курлом - в мусорку.

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

clayton

Гость
#3
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, из-за чего итерация не происходить. Возможно какае-то ошибка?
 
T

typak

Гость
#4
Зделай так :
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 );
Всё сщитает