Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скачать первые несколько байт файла 
:(
    Опции темы
djusha
Дата 20.4.2011, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 11.6.2008

Репутация: нет
Всего: нет



Доброго времени суток!

возникла необходимость получать скриптом не все файлы, а только первые несколько байт, поскольку нужная информация именно там 

В принципе приведенный ниже пример работает, но все равно долго... 5-7 секунд для скачивания первых байт это долго...
Есть ли идеи получше?

Код


#!/usr/bin/perl
 use strict;
 use warnings;

use LWP::UserAgent;
my $max_size   = 6;      # размер в байтах

my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new('GET' => "ftp://ftp.microsoft.com/developr/Interix/interix22/gcc.source.shlib.0.2.tar"); # этот большой файл только для примера
#my $req = HTTP::Request->new('GET' => "ftp://ftp.microsoft.com/developr/Interix/interix22/GPL.TXT");

my $res = $ua->request($req, \&callback, 6);

 my $size = 0;
 my $res_content;
 
 sub callback {     my($data, $response, $protocol) = @_; $size +=  length($data); $res_content .= $data; if($size > $max_size) { die; }}

 print $res_content . "\n\n ".  length($res_content) . "\n\n";            # файл





PM WWW   Вверх
djusha
Дата 20.4.2011, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 11.6.2008

Репутация: нет
Всего: нет



другой вопрос по вышеприведенному скрипту... хочу завернуть его в подпрограмму...


Код

#!/usr/bin/perl
 use strict;
 use warnings;
 
sub checkCYImage { #
use LWP::UserAgent;
my $max_size   = "7";      # размер в байтах

my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new('GET' => "ftp://ftp.microsoft.com/developr/Interix/interix22/gcc.source.shlib.0.2.tar");
#my $req = HTTP::Request->new('GET' => "ftp://ftp.microsoft.com/developr/Interix/interix22/GPL.TXT");

my $res = $ua->request($req, \&callback, $max_size);

 my $size = 0;
 my $res_content;
 sub callback {     my($data, $response, $protocol) = @_; $size +=  length($data); $res_content .= $data; if($size > $max_size) { die; }}

return $res_content . "\n\n ".  length($res_content) . "\n\n";            # файл
}


my $file = &checkCYImage();
print $file . "\n";



но получаю ошибку....

Variable "$size" will not stay shared at tic_by_image.cgi line 22.
Variable "$res_content" will not stay shared at tic_by_image.cgi line 22.
Variable "$max_size" will not stay shared at tic_by_image.cgi line 22.


понимаю, что это из за того, что в подпрограмме вложенная программа  "sub callback"
как это оформить правильно?
PM WWW   Вверх
Pfailed
Дата 21.4.2011, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39



Цитата(djusha @  20.4.2011,  21:51 Найти цитируемый пост)
5-7 секунд для скачивания первых байт это долго

Большую часть из этого времени занимают команды ftp. Открытие соединения, переход в нужную директорию, создание канала для передачи файла и т.д. В случае с http должно быть быстрее, потому как там выполняется только 1 запрос на сервер.


Цитата(djusha @  20.4.2011,  22:14 Найти цитируемый пост)
хочу завернуть его в подпрограмму

Используйте анонимную подпрограмму. В таком духе
Код

my $res = $ua->request($req, sub { здесь нужный код }, $max_size);




--------------------
PM MAIL   Вверх
djusha
Дата 21.4.2011, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 11.6.2008

Репутация: нет
Всего: нет



Цитата(Pfailed @ 21.4.2011,  07:20)
Цитата(djusha @  20.4.2011,  21:51 Найти цитируемый пост)
5-7 секунд для скачивания первых байт это долго

Большую часть из этого времени занимают команды ftp. Открытие соединения, переход в нужную директорию, создание канала для передачи файла и т.д. В случае с http должно быть быстрее, потому как там выполняется только 1 запрос на сервер.


Цитата(djusha @  20.4.2011,  22:14 Найти цитируемый пост)
хочу завернуть его в подпрограмму

Используйте анонимную подпрограмму. В таком духе
Код

my $res = $ua->request($req, sub { здесь нужный код }, $max_size);

За подсказку в направлении анонимной подпрограммы большое человеческое спасибо! работает

Для общего ознакомления... имеются ли еще какие либо пути для скачивания части файлов?
PM WWW   Вверх
DurRandir
Дата 21.4.2011, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 1
Всего: 17



Для HTTP можно указать Range-запрос. Не знаю правда, насколько просто это сделать через LWP.
PM   Вверх
Pfailed
Дата 22.4.2011, 07:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39



Цитата(DurRandir @  21.4.2011,  22:31 Найти цитируемый пост)
Для HTTP можно указать Range-запрос. Не знаю правда, насколько просто это сделать через LWP. 

Очень просто: http://forum.vingrad.ru/index.php?showtopi...t&p=2304267


Цитата(djusha @  21.4.2011,  21:34 Найти цитируемый пост)
имеются ли еще какие либо пути для скачивания части файлов? 

С ftp можно попробовать в таком духе
Код

use Net::FTP;

my $ftp = Net::FTP->new('ftp.microsoft.com', Passive => 1)
    or die $@;
    
$ftp->login('anonymous')
    or die $ftp->message;

$ftp->binary();

my $fh = $ftp->retr('/developr/Interix/interix22/gcc.source.shlib.0.2.tar')
    or die $ftp->message;
    
my $max_size = 6;
my $buf;

while (length($buf) < $max_size) {
    sysread($fh, $buf, $max_size, length($buf))
        or last;
}

eval { $fh->close() };
$ftp->quit();




--------------------
PM MAIL   Вверх
djusha
Дата 25.4.2011, 05:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 11.6.2008

Репутация: нет
Всего: нет



всем спасибо!

Просто за скрипты берусь наскоками, иногда забываю, что раньше делал, и что мне раньше советовали  smile 

Это сообщение отредактировал(а) djusha - 25.4.2011, 05:52
PM WWW   Вверх
djusha
Дата 25.4.2011, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 11.6.2008

Репутация: нет
Всего: нет




что то не так делаю... вместо 50 байт он всю страницу выдает...


Код

#!/usr/bin/perl
 use strict;
 use warnings;

my $url = 'http://www.google.ru';

use LWP::UserAgent;

my $ua = LWP::UserAgent->new;
#$ua->proxy('http', "http://192.168.0.1:3128"); #  прокси
# $ua->env_proxy;
#$ua->agent("Opera/9.80 (J2ME/MIDP; Opera Mini/4.1.15082/23.377; U; en) Presto/2.5.25 Version/10.54"); # pretend we are very capable browser
$ua->timeout(145);

my $response = $ua->get($url, Range => 'bytes=50-'); 

 if ($response->is_success) {
my $content = $response->content; 
print $content;
    } else {        print ($response->status_line);  }

PM WWW   Вверх
Pfailed
Дата 25.4.2011, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39



Цитата(djusha @  25.4.2011,  09:05 Найти цитируемый пост)
что то не так делаю... вместо 50 байт он всю страницу выдает...

Читаем по ссылке http://forum.vingrad.ru/topic-323196/view-.../p-2304267.html
Цитата

Но на большинстве серверов это работает только на отдачу статических файлов, с динамически генерируемыми страницами работать не будет.


Добавлено через 6 минут и 47 секунд
Цитата(djusha @  25.4.2011,  09:05 Найти цитируемый пост)
вместо 50 байт он всю страницу выдает...

Плюс ко всему 'bytes=50-' означает "выдать весь файл кроме первых 50 байт"
Скачать 50 байт, как можно догадаться 'bytes=0-50'


--------------------
PM MAIL   Вверх
djusha
Дата 25.4.2011, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 11.6.2008

Репутация: нет
Всего: нет



Цитата(Pfailed @ 25.4.2011,  10:31)
Цитата

Но на большинстве серверов это работает только на отдачу статических файлов, с динамически генерируемыми страницами работать не будет.


прочитать то прочитал... но....

Код

В HTTP есть для этого специальное средство, кажется это называется byte ranges. Но на большинстве серверов это работает только на отдачу статических файлов, с динамически генерируемыми страницами работать не будет.
В LWP это можно сделать так



понял, что это относится только к HTTP


в любом случае спасибо!

Это сообщение отредактировал(а) djusha - 25.4.2011, 14:38
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.1068 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.