Alexander Schäfer: LWP, Stausanzeiges beim downloaden!

hi all,

ich frage mich wie man den aktuellen Status einer zZ downgeloadenen Datei, auf den Bildschirm bekommt.

-----------------------
use CGI qw/:standard/;
use LWP::Simple;
$url = param("url");
$name = param("url");
$rc = LWP::Simple::getstore($url, "$name");
-----------------------
das nur damit man weiss was ich in etwa meine.

ich möchte nämlich über mienem webserver Dateien auf seine Festplatte laden.. über Perl, und das auf einer website betrachten...(dort gebe ich auch die URL ein)

vielen Dank schon im Voraus

Alexander Schäfer

  1. ich frage mich wie man den aktuellen Status einer zZ downgeloadenen Datei, auf den Bildschirm bekommt.

    Das geht kaum oder nur auf grossen Umwegen. Die momentane Architektur von libwww-perl erlaubt das eigentlich nicht. LWP-ng wird da ggf. besser sein, da du dann mit $ua->spool() deine Requests im Hintergrund auführen kannst.

    Was du machten könntest, wäre direkt das Modul zu patchen wo vom Socket gelesen wird, indem du nur kleine Häppchen einliest und jeweils ein print Statement nach jedem Häppchen eibaust, das ist allerdings kaum sauber.

    1. hmmm, schade.. hätte micht gefreut...

      ok dann en andere Frage zum gleichen Thema(LWP). Wenn ich ja jetzt eine datei downloade geschieht das ja nicht sofort.. nach einer wile aber bricht der Browser ja ab... kann man mindestens etwas machen damit der Browser nicht abbricht... also dann zum schluss noch ein fertig vom perlskript bekommt.

      Alexander Schäfer

      PS: danke für die Antwort, und die danke für die Kommende

      1. hmmm, schade.. hätte micht gefreut...

        Korrektur, in perldoc lwpcook ist ein Beispiel wie es doch geht. Ich hatte nicht bedacht, dass LWP::UserAgent->request eine code-referenz akzeptiert.

        ok dann en andere Frage zum gleichen Thema(LWP). Wenn ich ja jetzt eine datei downloade geschieht das ja nicht sofort.. nach einer wile aber bricht der Browser ja ab... kann man mindestens etwas machen damit der Browser nicht abbricht... also dann zum schluss noch ein fertig vom perlskript bekommt.

        Hm, was hat libwww-perl mit Browsern zu tun? Willst du, dass ein CGI-Script nicht vom Server gekillt wird?

        1. genau...

          1. $ua = new LWP::UserAgent;

            my $expected_length;
            my $bytes_received = 0;
            $ua->request(HTTP::Request->new('GET', $url), sub {
            my($chunk, $res) = @_;
            $bytes_received += length($chunk);
            unless (defined $expected_length) {
            $expected_length = $res->content_length 0;
            }
            if ($expected_length) {
            printf STDERR "%d%% - ",100 * $bytes_received / $expected_lengt
            }
            print STDERR "$bytes_received bytes received\n";
            print $chunk;
            });

            meintest du das?

            1. meintest du das?

              Ja. Warum?

              1. ok, habs geschaft ;)

                Merci für die Hilfe...

                print "<b>URL:</b> $url <b>Dateiname:</b>$path $localfile<br>";

                print start_form;
                print textfield(-NAME => "size");
                print end_form;
                print script("document.forms[0].size.value = '0'");
                $i = 0;
                $ua  = new LWP::UserAgent;
                $req = HTTP::Request->new('GET', $url);
                open(FILE, ">$path$localfile") or die "Bitte einen Filenamen wählen den man erstellen kann!! $localfile ist schlecht";
                $response = $ua->request($req,
                                 sub { $data = shift;
                                       $total += length($data);
                                       print FILE $data;
                         if ($i >= 70) {
                                       print script("document.forms[0].size.value = '$total'");
                         $i = 0;
                         }
                       $i++
                                     },
                                 1000000);
                close(FILE);
                die $response->as_string() if $response->is_error();
                print "fertig";

                lol, schon wieder anders... habs auf einem 100Mbit/s webserver laufen...