Forum Webscript.Ru

Программирование => Perl => Тема начата: lamerz от 08 Февраля 2007, 14:06:03

Название: Как получить большой файл частями?
Отправлено: lamerz от 08 Февраля 2007, 14:06:03
Как получить большой файл с сервера на сервер частями?
Название: Как получить большой файл частями?
Отправлено: arto от 08 Февраля 2007, 15:28:12
если сервер поддерживает -- chunked read
Название: Как получить большой файл частями?
Отправлено: andymc от 08 Февраля 2007, 23:39:15
Так и хочется сказать
Цитировать
я бы взял частями, но мне нужно сразу
Название: Как получить большой файл частями?
Отправлено: lamerz от 15 Февраля 2007, 11:22:38
Так и хочется сказать форум отстой, не одного нормального совета или решиния, кроме perldoc Ж)
Название: Как получить большой файл частями?
Отправлено: arto от 15 Февраля 2007, 11:30:24
если вам это не помогло -- это ваши проблемы.
Название: Как получить большой файл частями?
Отправлено: lamerz от 15 Февраля 2007, 11:34:58
"я бы взял частями, но мне нужно сразу"

да это сильно мне помогло:)
Название: Как получить большой файл частями?
Отправлено: nacsa от 15 Февраля 2007, 14:54:17
может это поможет:


Доставка больших документов

1-й вариант. Записываем данные в процессе скачивания в файл

use LWP::UserAgent;
$ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => \'http://www.linpro.no/lwp/libwww-perl-5.46.tar.gz\');
$res = $ua->request($req, "libwww-perl.tar.gz");
if ($res->is_success) {
         print "ok\\n";
}else{
         print $res->status_line, "\\n";
}

2-й вариант. Вставка контролирующей подпрограммы в качестве второго аргумента $ua->request(). В этом варианте можно записывать скачиваемый файл по кусочкам, чтобы в случае обрыва связи потом его докачать.

use LWP::UserAgent;
$ua = LWP::UserAgent->new;
$URL = \'ftp://ftp.unit.no/pub/rfc/rfc-index.txt\';
my $expected_length;
my $bytes_received = 0;
my $res =$ua->request(HTTP::Request->new(GET => $URL),
                 sub {
                         my($chunk, $res) = @_;
                         $bytes_received += length($chunk);
                         unless (defined $expected_length) {
                                 $expected_length = $res->content_length || 0;
                         }
                         if ($expected_length) {
                                 printf STDERR "%d%% - ",
                                 100 * $bytes_received / $expected_length;
                 }
                         print STDERR "$bytes_received bytes received\\n";
                         # В $chunk - текущие данные
                         # print $chunk;
                 }
);
print $res->status_line, "\\n";