Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hello

I am trying to improve some code. Basically, I want to build a downloader with progress bar. I know how to download file, how to build a progress bar (for example in Tk). What I cannot solve is appending the portion of file I have downloaded to the main (final) file. Here it is what I got (stripped of the GUI part. The code is based on a solution I found on the web.

use strict; use warnings; use LWP::Simple; use LWP::UserAgent; my $url='www.myurl.com'; 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 ); #Here I need to append the bit of file downloaded, but I am down +loaded the entire file over and over... my $file = 'myfile.exe'; getstore($url, $file); });

Replies are listed 'Best First'.
Re: Appending downlad file LWP
by choroba (Cardinal) on Feb 16, 2018 at 19:36 UTC
    Just open the file before starting the download, then print the downloaded chunk into it in the callback:
    #!/usr/bin/perl use strict; use warnings; use LWP::UserAgent; my $url = 'http://www.example.com'; my $file = 'myfile.exe'; my $ttlDown = 0; my $ua = LWP::UserAgent->new; open my $out, '>', $file or die "$file: $!"; my $resp = $ua->get( $url, ':content_cb' => sub { my ($data, $response) = @_; my $size = $response->content_length; $ttlDown += length $data; printf STDERR "%7.1f KB of %7.1f (%5.1f%%)\n", $ttlDown / 1024.0, $size / 1024.0, $ttlDown * 100.0 / $siz +e; print {$out} $data; }, ); close $out;
    ($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,

      The file downloaded this way does not seem to work. I tried with PDFs and JPGs. In both case the files are not as they should (picture is a mess of colours, PDF is blank). What am I overseeing?

      I forgot to mention that also exe doesn't work. They do not seem to be reconstructed properly and Windows say they are corrupted

        A, you're on MSWin? Try specifying
        open my $out, '>:raw', $file or die "$file: $!";

        to turn off special handling of newlines.

        ($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,