Sralinca: Datei über HTTP downloaden wenn vorhanden!?

Hi Leute,

kann mir jemand von euch erläutern wie ich folgendes "Problem" lösen kann:

ich möchte ein Script coden, welches eine Anfrage an einen Webserver sendet ob in einem Bestimmten Unterverzeichnis die Datei "readme.txt" vorhanden ist, und wenn ja soll das Script diese Datei downloaden.
Also irgendwie

if (Dateiexistiert) dann GET Datei und speichere sie unter xyz.

Wie macht man das?

Ich danke euch schon mal!!!
mfg
Sralinca

  1. hi!

    ich möchte ein Script coden, welches eine Anfrage an einen
    Webserver sendet ob in einem Bestimmten Unterverzeichnis die Datei
    "readme.txt" vorhanden ist, und wenn ja soll das Script diese
    Datei downloaden.

    Du suchst das Modul LWP::Simple, nähere Informationen nach der
    Installation mit
      perldoc LWP::Simple

    Die Funtkionen get() bzw. getstore() und head() sind vermutlich die,
    die du suchst. Alles weitere dazu findet sich im Archiv.

    bye, Frank!

  2. Hi,

    kann mir jemand von euch erläutern wie ich folgendes "Problem" lösen kann:

    ich möchte ein Script coden, welches eine Anfrage an einen Webserver sendet ob in einem Bestimmten Unterverzeichnis die Datei "readme.txt" vorhanden ist, und wenn ja soll das Script diese Datei downloaden.
    Also irgendwie

    if (Dateiexistiert) dann GET Datei und speichere sie unter xyz.

    Wie macht man das?

    Ich danke euch schon mal!!!
    mfg
    Sralinca

    use LWP::UserAgent;
    use HTTP::Request;
    my $ua = new LWP::UserAgent;
    my $URL = "http://www.domain.tld/readme.txt";
    my $path = "C:/data/readme.txt";
    my $content;
    my $request = HTTP::Request->new(GET => $URL);
    my $response = $ua->request($request);
    if ($response->is_error()) {
    print "Error: Could not get this URL - the response has been:\n";
    print $response->status_line, "\n";
    } else {
    $content = $response->content();
    open (FILE, ">$path");
      print FILE "$content";
    close (FILE);
    }

    ciao,
    rob.

    1. hi!

      use LWP::UserAgent;
      use HTTP::Request;
      my $ua = new LWP::UserAgent;
      my $URL = "http://www.domain.tld/readme.txt"
      my $path = "C:/data/readme.txt"
      my $content;
      my $request = HTTP::Request->new(GET => $URL);
      my $response = $ua->request($request);
      if ($response->is_error()) {

      »»  print "Error: Could not get this URL - the response has been:\n"
      »»  print $response->status_line, "\n"

      } else {

      »»  $content = $response->content();
      »»  open (FILE, ">$path");

      print FILE "$content"

      »»  close (FILE);

      }

      Klar, warum einfach, wenn's auch kompliziert geht? Auch für dich wäre
      es vielleicht nicht verkehrt, mal perldoc LWP::Simple anzuschauen.
      Abgesehen davon halte ich es nicht für sinnvoll, Leute am denken zu
      hindern, indem man ihnen für so einfache Probleme vollständig
      ausgearbeitete Lösungen vorsetzt.

      bye, Frank!

      1. Hi Frank!

        Klar, warum einfach, wenn's auch kompliziert geht? Auch für dich wäre
        es vielleicht nicht verkehrt, mal perldoc LWP::Simple anzuschauen.

        Nun ja, LWP::Simple traegt seinen Namen wirklich sehr zu recht. Ich verwende selbst fuer einfache Dinge auch lieber eine Variante aehnlich der von Robert. Denn ich moechte z.B. gerne wissen, *warum* ich eine Datei nicht bekomme, das sagt mir die Simple-Version aber nicht (ausser mit einem weiteren head-Request, der aber nicht zwingend dasselbe Ergebnis bringen muss und ausserdem unnoetig Traffic erzeugt). Also die Mehrarbeit ist schon nicht ganz umsonst, und wenn man es einmal gemacht hat, ist es auch nicht mehr so kompliziert. :-)

        So long

        1. Hi,

          Nun ja, LWP::Simple traegt seinen Namen wirklich sehr zu recht. Ich verwende selbst fuer einfache Dinge auch lieber eine Variante aehnlich der von Robert. Denn ich moechte z.B. gerne wissen, *warum* ich eine Datei nicht bekomme, das sagt mir die Simple-Version aber nicht (ausser mit einem weiteren head-Request, der aber nicht zwingend dasselbe Ergebnis bringen muss und ausserdem unnoetig Traffic erzeugt). Also die Mehrarbeit ist schon nicht ganz umsonst, und wenn man es einmal gemacht hat, ist es auch nicht mehr so kompliziert. :-)

          Genau, Calocybe! Einmal ein paar zeilen mehr code und die möglichkeiten erweitern sich um ein zigfaches. Das LWP::Simple modul ist für mich unnötig, wo es doch LWP::UserAgent gibt. Bei der rückgabe des statuscodes fängt es schon mal an. Dann hat man kontrolle über das timeout. Weiters werden nicht nur http requests, sondern auch FTP u.a. protokolle unterstützt. Mein lösungsansatz ist auch keinesfalls "vollständig" - es fehlen noch fehlerabfragen und -ausgaben etc. Und, Frank, hast du das leitmotiv von Larry Wall für sein perl vergessen:
          TMTOWTDI (sprich "tim toady" und bedeutet "there's more than one way to do it")?

          grüsse,
          rob.

          1. Hi Rob,

            Genau, Calocybe! Einmal ein paar zeilen mehr code und die möglichkeiten erweitern sich um ein zigfaches. Das LWP::Simple modul ist für mich unnötig, wo es doch LWP::UserAgent gibt. Bei der rückgabe des statuscodes fängt es schon mal an. Dann hat man kontrolle über das timeout. Weiters werden nicht nur http requests, sondern auch FTP u.a. protokolle unterstützt. Mein lösungsansatz ist auch keinesfalls "vollständig" - es fehlen noch fehlerabfragen und -ausgaben etc. Und, Frank, hast du das leitmotiv von Larry Wall für sein perl vergessen:
            TMTOWTDI (sprich "tim toady" und bedeutet "there's more than one way to do it")?

            Meinst Du nicht auch, dass sich die Möglichkeiten geradezu ins unendliche erweitern, wenn auch von LWP::UserAgent Abstand nimmt und lieber direkt an die Sockets geht ?  ;-))

            Nun, ich denke, daß auch LWP::Simple seine Berechtigung hat! Man kann ja nun auch nicht immer allgemein Programmieren, so daß spätere Anforderungen mit wenigen Handgriffen übernommen werden können. LWP::Simple läßt einen halt erstmal schnell über URLs Daten beziehen. Wenn man später mehr an den Requests und Responses oder Headern rumwurschteln möchte, kann man ja ohne Probleme zum UserAgent wechsel. Man hat ja nicht wirklich in die falsche Richtung programmiert und muß Unmengen an Code verwerfen ...

            Unabhängig davon, wie man zu einer Lösung kommt, ist aber wohl eher wichtig, daß diese 1. läuft und 2. auch "sauber" ist (einfach zu lesen, gut kommentiert und strukturiert ...). Ansonsten greift natürlich TIMTOWDI. Über Performance-Unterschiede muß man sich meißt eh keine Gedanken machen, so unperformant das Prinzip CGI von sich aus schon ist!

            Gruß,
               Jörk