• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

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

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?
 
V

vital

Качать файлы курлом - в мусорку.

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

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

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 );

Всё сщитает
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!