3

Я написал сценарий, поэтому я могу автоматически загружать из hotfile, используя LWP::UserAgent. Мне удалось получить файл для загрузки правильно. Как мне узнать размер файла перед загрузкой?

Мне нужно это для отображения горячей части файла было загружено.

3 ответа3

4

Вот короткий фрагмент, который делает это.

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;

Источник

2

Просто получить размер очень просто:

use LWP::Simple;

my $url='http://www.superuser.com/favicon.ico';
my ($type, $size) = head($url) or die "ERROR $url: $!";
print "$url: type: $type, size: $size$/";

,

Однако для реального индикатора прогресса вы должны зарегистрировать обратный вызов, например:

use LWP::UserAgent;

my $url='http://superuser.com/questions/200468/how-to-get-file-size-before-downloading-the-file-lwpuseragent?rq=1';#'http://www.superuser.com/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 : вы можете записать полученные байты на диск.

1

Приведенный выше ответ от 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;
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .