in reply to FTP Transfer Status

Why not just turn on hashmarks?
 use Net::FTP;
    $ftp = Net::FTP->new("ftp.microsoft.com", Debug => 0);
    $ftp->login("anonymous",'-anonymous@');
    $ftp->cwd("MISC");
    $ftp->hash(STDOUT,1024);
    $ftp->get("NBFCP.TXT");
    $ftp->quit;

of course, to display this in a CGI would be a bit more effort since the hash marks don't have line feeds.

Replies are listed 'Best First'.
Re: Re: FTP Transfer Status
by DrManhattan (Chaplain) on Mar 11, 2003 at 19:44 UTC
    This is kind of kludgey, but here's a way to output arbitrary text for each hash mark Net::FTP prints.
    #!/usr/bin/perl use strict; use Net::FTP; my $BYTES_PER_HASH = 1024; # Fork a child process for Net::FTP # and capture its output one char at # a time if (open(FTP, "-|")) { # parent my $count = 1; while (getc(FTP)) { print $BYTES_PER_HASH * $count, " bytes received\n"; $count++; } print "Done\n"; } else { # child my $ftp = Net::FTP->new("ftp.microsoft.com", Debug => 0); $ftp->login("anonymous","-anonymous\@"); $ftp->cwd("MISC"); $ftp->hash(\*STDOUT, $BYTES_PER_HASH); $ftp->get("NBFCP.TXT"); $ftp->quit; }

    If you know the size of the file (or use Net::FTP to get it before starting the download), you could use this to output a progress meter. If you don't want to output plain text, you could output javascript that updates a graphic meter instead.

    -Matt

      Guys,

      Thanks for all of your help. I am looking at Matt's solution. The fork part of the script doesn’t seem to work properly. I have tried it on a Windows machine running Perl 5.6.1 and it runs the child process and carries out the FTP but it dosnt print the Bytes recieved, however on a Linux machine also with Perl 5.6.1 it just prints done. and FTP's nothing and also displays no Bytes Recieved.

      Any ideas because this method looks very promising.

      Thanks again for all your help.

      Al

        It could very well be hosed under Win32. I'm not sure how well a Win32 perl port would simulate fork(). It does work alright for me under Linux though.

        As it's written now, the script exits silently if there's an error. Try copying out the bit listed as "child" into a separate file, setting Debug => 1, and seeing if it gives you any output.

        #!/usr/bin/perl use strict; use Net::FTP; my $BYTES_PER_HASH = 1024; # child my $ftp = Net::FTP->new("ftp.microsoft.com", Debug => 1); $ftp->login("anonymous","-anonymous\@"); $ftp->cwd("MISC"); $ftp->hash(\*STDOUT, $BYTES_PER_HASH); $ftp->get("NBFCP.TXT"); $ftp->quit;

        -Matt