Siechfred: Existenz einer Datei auf einem anderen Server prüfen

Einen sonnigen Nachmittag allerseits,

ich möchte überprüfen, ob eine Datei auf einem anderen Server vorhanden ist. Soll heißen, wenn jemand in einem Formular z.B. einen Grafik-Link angibt nach dem Schema "http://www.irgendwas.de/grafik.gif", dann suche ich nach einer Möglichkeit, mit Perl zu überprüfen, ob es diese Datei überhaupt gibt. Und hierzu gleich noch eine Frage. Ich möchte mit einem regulären Ausdruck überprüfen, ob am Ende des Links die Zeichenfolgen "gif" oder "jpg" stehen:

if($eingabe != /(gif|jpg)$/) {
  # Hinweis, dass nur GIF- oder JPG-Grafiken erlaubt sind
}

Funktioniert das so?

Viele Grüße
Torsten

--
Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
  1. hi

    Einen sonnigen Nachmittag allerseits,

    ich möchte überprüfen, ob eine Datei auf einem anderen Server vorhanden ist. Soll heißen, wenn jemand in einem Formular z.B. einen Grafik-Link angibt nach dem Schema "http://www.irgendwas.de/grafik.gif", dann suche ich nach einer Möglichkeit, mit Perl zu überprüfen, ob es diese Datei überhaupt gibt.

    Ich würde es mal mit dem Modul LWP::Simple oder LWP::UserAgent versuchen.
    http://www.perldoc.com/perl5.8.0/lib/lwpcook.html
    Und dann auf is->succes überprüfuen.
    Aber musste versuchen, ist bloß ne Idee.

    Und hierzu gleich noch eine Frage. Ich möchte mit einem regulären Ausdruck überprüfen, ob am Ende des Links die Zeichenfolgen "gif" oder "jpg" stehen:

    if($eingabe != /(gif|jpg)$/) {
      # Hinweis, dass nur GIF- oder JPG-Grafiken erlaubt sind
    }

    Funktioniert das so?

    Hast es getestet ?
    Wenn ja, dann weisst es ja :o)
    Ich denke aber schon.

    cya
    alligator

    1. Einen immer noch sonnigen Nachmittag,

      Hast es getestet ?
      Wenn ja, dann weisst es ja :o)

      Nö, geht nicht :(

      Viele Grüße
      Torsten

      --
      Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
      1. Hook,

        und was ist mit

        unless ($eingabe =~ /(gif|jpg)$/) {
          # Hinweis, dass nur GIF- oder JPG-Grafiken erlaubt sind
        }

        cya
        alligator

        1. Hallo Pirat ;-)

          unless ($eingabe =~ /(gif|jpg)$/) {
            # Hinweis, dass nur GIF- oder JPG-Grafiken erlaubt sind
          }

          Hab's jetzt so gelöst, geht

          if ($eingabe =~ /[gif|jpg|jpeg]$/g) {
            message_win("Format okay");
          }
          else {
            message_win("Falsches Format");
            exit(1);
          }

          Werde mich jetzt mal an das andere Problem heranwagen ....

          Viele Grüße
          Torsten

          --
          Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
          1. Hi!

            if ($eingabe =~ /[gif|jpg|jpeg]$/g) {

            Wird nicht funktionieren. z.B. wird 'data.bmp' erkannt. Auswahlmöglichkeiten werden nicht mit eckigen Klammern gemacht.

            IMHO optimale Lösung ist:
            if ($eingabe =~ /(?:gif|jp(?:e)?g)$/g)

            Gruß Maik

            1. Hallöle,

              IMHO optimale Lösung ist:
              if ($eingabe =~ /(?:gif|jp(?:e)?g)$/g)

              Danke, jetzt geht es _wirklich_.

              Viele Grüße
              Torsten

              --
              Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
              1. Hi,

                Danke, jetzt geht es _wirklich_.

                Ist aber immer noch nicht optimal. Ich würde noch zusätzlich mit Image::Size prüfen, ob es ein "echtes" Bild ist. Das ist nämlich recht schwer täuschbar.

                Grüße Andres Freund

                --
                ss:) zu:) ls:} fo:) de:] va:) ch:| n4:& rl:° br:^ js:( ie:% fl:( mo:|
                1. Hallöle,

                  Ist aber immer noch nicht optimal. Ich würde noch zusätzlich mit Image::Size prüfen, ob es ein "echtes" Bild ist. Das ist nämlich recht schwer täuschbar.

                  Das steht mir afaik nicht zur Verfügung.

                  Viele Grüße
                  Torsten

                  --
                  Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
                  1. N'Abend Sichfried,

                    Das steht mir afaik nicht zur Verfügung.

                    Dann installiere es dir doch selber. Es ist ein reines Perl Modul. Daher sollte das kein Problem sein.

                    Grüße Andres Freund

                    --
                    ss:) zu:) ls:} fo:) de:] va:) ch:| n4:& rl:° br:^ js:( ie:% fl:( mo:|
                    1. Hallöle,

                      Dann installiere es dir doch selber. Es ist ein reines Perl Modul. Daher sollte das kein Problem sein.

                      Da stoße ich nun wieder an meine Wissensgrenzen. Wo ich es herbekomme, ist mir klar, aber wie installiere ich es auf dem Webserver? Einfach nur mit ins CGI-BIN kopieren? Klingt irgendwie zu einfach.

                      Viele Grüße
                      Torsten

                      --
                      Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
                      1. N'Abend *zuvertrauensvollzufreund(aka hagen)seiender*

                        Da stoße ich nun wieder an meine Wissensgrenzen. Wo ich es herbekomme, ist mir klar, aber wie installiere ich es auf dem Webserver? Einfach nur mit ins CGI-BIN kopieren? Klingt irgendwie zu einfach.

                        Tja, das ist Perl. So einfach wie möglich, so kopliziert wie nötig *g*. Du musst die Datei in das jetztige Verzeichniss hinzufügen, oder das Verzeichniss mittels "use lib()" angeben.

                        Grüße Andres Freund

                        --
                        ss:) zu:) ls:} fo:) de:] va:) ch:| n4:& rl:° br:^ js:( ie:% fl:( mo:|
        2. Servus nochmal,

          Musterkerkennung kanst du so
          !~
          negieren.

          cya
          alligator

  2. Hallo,

    Und hierzu gleich noch eine Frage. Ich möchte mit einem regulären Ausdruck überprüfen, ob am Ende des Links die Zeichenfolgen "gif" oder "jpg" stehen:

    if($eingabe != /(gif|jpg)$/) {

    Du vergleichst hier einen String mit einem regulären Ausdruck. Du solltest den regulären Ausdruck anwenden.
    http://selfhtml.teamone.de/cgiperl/sprache/regexpr.htm#anwenden

    # Hinweis, dass nur GIF- oder JPG-Grafiken erlaubt sind
    }

    viele Grüße

    Axel

    1. Hallöle,

      Du vergleichst hier einen String mit einem regulären Ausdruck. Du solltest den regulären Ausdruck anwenden.

      Hab die Lösung gefunden, danke. Allerdings gehen die Probleme jetzt mit LWP::Simple weiter. Folgendes habe ich jetzt weiter versucht:

      [...]
      use LWP::Simple;
      [...]
      if( is_success($uri)) {
        # mach weiter
      }
      else
        # Abbruch mit Fehlermeldung
      }

      Gebe ich ein Ziel an, von dem ich ganz genau weiß, dass es existiert, kommt trotzdem der Abbruch mit Fehlermeldung. Woran kann das liegen?

      Viele Grüße
      Torsten

      --
      Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
      1. Hallo,

        Allerdings gehen die Probleme jetzt mit LWP::Simple weiter. Folgendes habe ich jetzt weiter versucht:

        [...]
        use LWP::Simple;
        [...]
        if( is_success($uri)) {

        Wo hast Du die Funktion is_success($uri) her?
        http://search.cpan.org/author/GAAS/libwww-perl-5.69/lib/LWP/Simple.pm
        besser:
        http://search.cpan.org/author/GAAS/libwww-perl-5.69/lib/LWP/UserAgent.pm

        viele Grüße

        Axel

  3. Hallöle,

    ich denke, dass ich die Lösungen gefunden habe, deshalb mal hier die Codeschnipsel, falls jemandem noch etwas auffällt oder eine bessere Lösung bekannt ist:

    1. URI auf Existenz prüfen:

    [...]
    use LWP::UserAgent;
    [...]

    $new_ua = LWP::UserAgent->new();
    $my_request = HTTP::Request->new('HEAD', $uri);
    $response = $new_ua->request($my_request);
    if( $response->is_success()) {
      # die Datei wurde gefunden
    }
    else {
      # die Datei wurde nicht gefunden
    }

    2. RegEX-Prüfung

    if ($uri =~ /(?:gif|jp(?:e)?g)$/g) {
      # Format okay
    }
    else {
      # Falsches Format
    }

    Vielen Dank an alle Helfer.

    Viele Grüße
    Torsten

    --
    Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
    1. Hallo,

      ich denke, dass ich die Lösungen gefunden habe, deshalb mal hier die Codeschnipsel, falls jemandem noch etwas auffällt oder eine bessere Lösung bekannt ist:

      1. URI auf Existenz prüfen:
      2. RegEX-Prüfung

      Ich würde das 2. wegfallen lassen. Wer sagt dann, dass eine JPEG oder GIF Grafik (was ist eigentlich mit PNG, die solltest du auch zulassen) unbdingt eine der von dir genannten Endungen hat?
      Da du in 1. ja eh schon den Header anforderst solltest du lieber den zurückgelieferten Content-type prüfen.

      Viele Grüße,

      Stefan

      --
      Lass dir das Tanzen NICHT verbieten
      http://tanzverbot.de
      1. Hi,

        ich denke, dass ich die Lösungen gefunden habe, deshalb mal hier die Codeschnipsel, falls jemandem noch etwas auffällt oder eine bessere Lösung bekannt ist:

        1. URI auf Existenz prüfen:
        2. RegEX-Prüfung
          Ich würde das 2. wegfallen lassen. Wer sagt dann, dass eine JPEG oder GIF Grafik (was ist eigentlich mit PNG, die solltest du auch zulassen) unbdingt eine der von dir genannten Endungen hat?

        Genau - denn es geht ja gar nicht um Dateien (wo Endungen eine Bedeutung haben können), sondern um (http-) Ressourcen, deren Endung keinerlei Bedeutung hat...

        Da du in 1. ja eh schon den Header anforderst solltest du lieber den zurückgelieferten Content-type prüfen.

        Seh ich auch so, wenn der mit image/ anfängt, sollte es passen, ggf. kann man aber auch noch weiter einschränken.

        cu,
        Andreas

        --
        Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
        http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
      2. Hallöle,

        Ich würde das 2. wegfallen lassen. Wer sagt dann, dass eine JPEG oder GIF Grafik (was ist eigentlich mit PNG, die solltest du auch zulassen) unbdingt eine der von dir genannten Endungen hat?
        Da du in 1. ja eh schon den Header anforderst solltest du lieber den zurückgelieferten Content-type prüfen.

        Jepp, darauf hätte ich auch selber kommen können, werde mich gleich mal dransetzen.

        Viele Grüße
        Torsten

        --
        Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
  4. Hallöle,

    ich glaube, es geschafft zu haben. Da das Script etwas länger geworden ist, hier der link: http://www.siechfreds-welt.de/cgi-bin/sourceview.pl?fn=checkuri, wer mal schauen möchte.

    Ansonsten zwei Tests mit Ressourcen, die es wirklich gibt:
    http://www.siechfreds-welt.de/cgi-bin/checkuri.pl?uri=http:%2F%2Fwww.rt211.de%2Ferfurt.jpg
    http://www.siechfreds-welt.de/cgi-bin/checkuri.pl?uri=http:%2F%2Fwww.rt211.de%2Findex.shtml

    Wer weitere Verbesserungsvorschläge hat, nur zu, so viel wie heute habe ich lange nicht dazu gelernt ;-)

    Viele Grüße
    Tors*ein klitzekleines bisschen stolz ist*ten

    --
    Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
    1. Hi!

      if( $header_text =~ /content-type: image/(jpeg|gif|png)/i ) {

      Besser:
      if ($response->content_type() =~ /image/(?:jpeg|gif|png)\b/i) {    # ungetestet

      So long

      --
      Es gibt Diebe, die nicht bestraft werden und einem doch das Kostbarste stehlen: die Zeit.
          -- Napoleon Bonaparte
      1. N'abend,

        Besser:
        if ($response->content_type() =~ /image/(?:jpeg|gif|png)\b/i) {    # ungetestet

        Funktioniert.

        Viele Grüße
        Torsten

        --
        Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.