Como obter o tamanho do arquivo antes de baixar o arquivo LWP :: useragent

3

Eu escrevi um script para poder baixar automaticamente de um hotfile usando LWP :: UserAgent . Eu consegui baixar o arquivo corretamente. Como faço para obter o tamanho do arquivo antes de fazer o download?

Eu preciso disso para exibir muito do download do arquivo.

    
por ageis23 17.10.2010 / 22:33

3 respostas

4

Aqui está um pequeno trecho que faz isso.

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;

Fonte

    
por 17.10.2010 / 22:42
2

Apenas obter o tamanho é muito simples:

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$/";

.

No entanto, para um indicador de progresso real , você precisa registrar um retorno de chamada, assim:

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

Observe a linha ##### TODO : talvez você queira gravar os bytes recebidos no disco.

    
por 17.08.2012 / 16:40
1

A resposta acima por Nifle me ajudou muito. Eu só gostaria de acrescentar que para um site HTTP autenticado, você precisa adicionar apenas uma linha, $ req- > authorization_basic ("$ name", "$ pwd"); E funciona bem.

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;
}
    
por 07.03.2014 / 11:10

Tags