Wolfgang Peterknecht: Überprüfung auf die Existenz einer Pfadangabe

Liebes Forum,

ich habe ein Uploadscript gebaut, mit dem Besucher Bilder auf meinen Server laden können. Dazu habe ich ein Formular erstellt mit einigen Input-Feldern mit denen die gewünschten Dateien definiert werden. Wenn jetzt jedoch ein Pfad auf dem Rechner des Besuchers nicht existiert oder ganz einfach keine gültige Adresse angegeben wurde bekomme ich eine Fehlermeldung, da ich alle eingehenden Files erst einmal mit der Funktion getimagesize(); auf ihren Dateityp usw. überprüfe. Wenn getimagesize(); jedoch eine ungültige Bildadresse gelieft bekommt, gibt es folgende Fehlermeldung aus:

Warning: getimagesize(): Read error! in /kunden/.../upload.php on line 3

über die Aussage dieser Meldung bin ich mir bewusst, würde aber gerne wissen wie man verhindern kann, dass Benutzer dem Programm falsche Pfadangaben oder nicht existierende Bilder schicken. Gibt es da eine Überprüfung ob der Pfad existiert ? Man könnte dem Benutzer dann ausgeben das er eine falsche Pfadangabe geliefert hat oder sich vielleicht einfach nur vertippt hat. Aber erst einmal müsste ich dies überprüfen...

Würde mich sehr über sinnvolle Antworten freuen

Mit freundlichen Grüßen

Wolfgang Peterknecht

  1. habe d'ehre

    Warning: getimagesize(): Read error! in /kunden/.../upload.php on line 3

    über die Aussage dieser Meldung bin ich mir bewusst, würde aber gerne wissen wie man verhindern kann, dass Benutzer dem Programm falsche Pfadangaben oder nicht existierende Bilder schicken. Gibt es da eine Überprüfung ob der Pfad existiert ?

    Was spricht gegen

    if(file_exists("$pfad/$datei"))
    tue das
    else
    Ausgabe Fehler

    man liest sich
    Wilhelm

    1. Hallo Wilhelm,

      ich danke ihnen. Ich konnte mein Problem lösen. Kann man mal sehen, dass man mit wenigen Handgriffen einige Sachen wirklich gravierend umlenken kann.

      DANKE

      Mit freundlichen Grüßen

      Wolfgang Peterknecht

      1. Hallo Wilhelm,

        ich konnte das Problem zwar lösen, doch jetzt sind sind die Variablen in denen die Funktion getimagesize(); steht durch die if-Anweisung nicht mehr gültig, d.h. es kann nicht mehr darauf zugegriffen werden:

        if(file_exists($_FILES['localfile']['name'][0])) { $size1 = GetImageSize ($_FILES['localfile']['tmp_name'][0]); }

        wenn ich jetzt angebe

        if($size1[2]=="2") { echo("Es ist ein JPEG!"); }

        ...kann auf die Variable $size1 nicht mehr zugegriffen werden, da eine if-Anweisung dies verhindert.

        Ich hoffe ihr könnt mir helfen

        Mit freundlichen Grüßen

        Wolfgang Peterknecht

        1. Moin Wolfgang,

          if(file_exists($_FILES['localfile']['name'][0])) { $size1 = GetImageSize ($_FILES['localfile']['tmp_name'][0]); }

          kann es daran liegen, dass du einmal name und das andere mal tmp_name benutzt?

          Grüße
          Mike

        2. hi,

          abgesehen von dem was Mike sagte:

          wenn du die grösse nicht mit getimagesize ermitteln konntest, weil schlicht und einfach gar kein bild hochgeladen wurde, dann ist es auch vollkommen sinnfrei, die abfrage

          if($size1[2]=="2") { echo("Es ist ein JPEG!"); }

          noch zu machen - also warumn machst du sie dann noch?

          (du hast bereits die möglichkeit gefunden, getimagesize nur unter bestimmten umständen aufzurufen - also warum greifst du auf $size1 nicht nur dann zu, wenn die gleichen umstände zutreffen?)

          gruss,
          wahsaga

          1. Hi wahsaga,

            ich glaube du hast mich noch nicht gant verstanden.

            if(file_exists($_FILES['localfile']['name'][0])) { $size1 = GetImageSize ($_FILES['localfile']['tmp_name'][0]); }

            Wenn das Bild existiert, dann erlaubt die if-Anweisung das die Variable $size1 den und den Wert hat (Die Variable $size1 wird freigegeben für das Script). Aber wenn ich jetzt ein echtes Bild habe was ich hochladen möchte, dann kann das Script nicht auf diese Variable $size1 zugreifen obwohl sie durch die Existenz des Bildes freigegeben wurde.

            MFG

            Wolfgang Peterknecht

          2. Hallo Forumer,

            ich hab das Problem für euch noch ein wenig erleichtert. Versucht euch mal bitte an diesem Quelltext:

            if(file_exists($_FILES['localfile']['name'][0])) { $size1 = GetImageSize ($_FILES['localfile']['tmp_name'][0]); }
            if($size1[2]=="1") { echo("Es ist ein GIF!"); }
            else { echo("Es ist kein GIF!"); }

            Da diese Zeilen nicht funktionieren, kann das ganze Script nicht mit der file-exists-Taktik fehlerfrei ablaufen.

            Habt ihr ne andere Lösung oder ein Verbesserungsvorschlag ?

            MFG

            Wolfgang Peterknecht

            1. Moin Wolfgang,

              du hast diese Frage noch nicht beantwortet:

              kann es daran liegen, dass du einmal name und das andere mal tmp_name benutzt?

              if(file_exists($_FILES['localfile']['name'][0])) { $size1 =

              ^^^^

              GetImageSize ($_FILES['localfile']['tmp_name'][0]); }^

              ^^^^^^^^
              Grüße
              Mike

              1. Hallo Mike,

                nein, da dann eine Fehlermeldung kommt!

                MFG

                Wolfgang Peterknecht

                1. Hallo Mike,

                  if(file_exists($_FILES['localfile']['name'][0])) { $size1 = GetImageSize ($_FILES['localfile']['tmp_name'][0]); }

                  ich weis jetzt woran es liegen könnte:
                  PHP kann nicht den Dateinamen $_FILES['localfile']['name'][0] auf dem Rechner des Benutzers wiederfinden, deshalb wird in jedem Fall FALSE zurückgegeben und die Variable mit der Funktion getimagesize(); kommt nicht zur Geltung. Ich brauch also genau die Angabe die auch im Formular vom Benutzer eingegeben wurde inkl. Pfadangaben usw. Aber da ich ja einen enctype="multipart/form-data" definiert habe wird kein String ausgegeben sondern einfach nur eine Datei. Ich kann also nicht mehr überprüfen was vom Benutzer im Formular angegeben wurde. Habt ihr vielleicht ne Idee wie man dies lösen könnte und somit die Datei auf dem Rechner des Benutzers später auf seine Existenz überprüfen könne ?

                  MFG

                  Wolfgang Peterknecht

                  1. habe d'ehre

                    Ich brauch also genau die Angabe die auch im Formular vom Benutzer eingegeben wurde inkl. Pfadangaben usw. Aber da ich ja einen enctype="multipart/form-data" definiert habe wird kein String ausgegeben sondern einfach nur eine Datei.

                    Frage: Verstehe ich Dein Ansinnen richtig?

                    Ein User soll von seiner lokalen Platte/CD eine Grafik auf Deinen Webserver laden und Du pruefst nach "senden" die eingegebenen Infos via PHP.

                    Wie bitte willst Du mit einem Serverprogramm auf einen lokalen Rechner zugreifen?

                    Ich verstehe ueberhaupt, warum der User einen Pfad und Dateinamen manuell eingeben muss.
                    Stelle einfach ein Feld <input type="file"> mit automatisch integrierter Browse-Funktion zur Verfuegung und pruefe den uebermittelten String auf das Vorkommen von .gif, .jpeg, .jpg, .png

                    Dann brauchst Du kein "file_exists" und den "getimagesize" nur fuer die Pruefung, ob eine bestimmte Dateigroesse ueberschritten wird.

                    Sollte ich voellig auf dem Holzweg sein, tja, dann solltest Du Dein Problem spezifizieren.

                    man liest sich
                    Wilhelm

                    1. habe d'ehre

                      Dann brauchst Du kein "file_exists" und den "getimagesize" nur fuer die Pruefung, ob eine bestimmte Dateigroesse ueberschritten wird.

                      Vergiss diesen Satz. :-)

                      attribute bei <input type="file">

                      maxlength="12345 " - maximale groesse der Datei
                      accept="image/*" - Mime Type images (alle)
                      accept="image/gif, image/jpg" - nur die beiden

                      man liest sich
                      Wilhelm

                      1. Hallo Wilhelm,

                        Dann brauchst Du kein "file_exists" und den "getimagesize" nur fuer die Pruefung, ob eine bestimmte Dateigroesse ueberschritten wird.

                        Vergiss diesen Satz. :-)

                        attribute bei <input type="file">

                        maxlength="12345 " - maximale groesse der Datei
                        accept="image/*" - Mime Type images (alle)
                        accept="image/gif, image/jpg" - nur die beiden

                        Und das funktioniert in Browsern? Außerdem lässt sich das doch mit einem manipulierten Formular oder einem schnell gestrickten Skript leicht aushebeln. Imho kommt man nicht um eine serverseitige Prüfung herum.

                        Gruß Alex

                        --
                        >> Dass in eine if Schleife zu packen schafft mein 10 jähriges Patenkind. [...]
                        > Mhhh, wenn man if in Schleifen packt, muss man sich auch nicht wundern, wenn die Patenkinder verwöhnte Luder werden. [...]
                        [TomIRL und Tom in ?t=64084&m=364291]
                        ss:) zu:} ls:} fo:| de:[ va:| ch:| sh:( n4:& rl:° br:& js:| ie:| fl:| mo:}
                        1. habe d'ehre

                          Und das funktioniert in Browsern? Außerdem lässt sich das doch mit einem manipulierten Formular oder einem schnell gestrickten Skript leicht aushebeln. Imho kommt man nicht um eine serverseitige Prüfung herum.

                          Das die Datei zusaetzlich gecheckt werden muss, sorry, so etwas setze ich voraus. ;-)

                          Was willst Du wie aushebeln?

                          man liest sich
                          Wilhelm

                          1. Hallo Wilhelm,

                            [Attribute maxlength und accept für input type="file"]

                            Das die Datei zusaetzlich gecheckt werden muss, sorry, so etwas setze ich voraus. ;-)

                            Was willst Du wie aushebeln?

                            Na die Attribute im Formular. :)
                            Einfach Seite im Editor entsprechend bearbeiten (Attribute auf die gewünschten Werte setzen) und lokal speichern. Dann lokale Datei aufrufen, Formular ausfüllen und absenden. Zur Not muss ich meinen Browser noch anweisen einen entsprechenden Referrer zu senden. Einfacher ist es natürlich, gleich einen Browser zu verwenden, der diese Attribute nicht interpretiert, bzw. sich vor allem nicht daran hält (wie z. B. Mozilla 1.3 :)).

                            Gruß Alex

                            --
                            >> Dass in eine if Schleife zu packen schafft mein 10 jähriges Patenkind. [...]
                            > Mhhh, wenn man if in Schleifen packt, muss man sich auch nicht wundern, wenn die Patenkinder verwöhnte Luder werden. [...]
                            [TomIRL und Tom in ?t=64084&m=364291]
                            ss:) zu:} ls:} fo:| de:[ va:| ch:| sh:( n4:& rl:° br:& js:| ie:| fl:| mo:}
                      2. Hallo Wilhelm,

                        http://www.visionofescaflowne.de/scripts/fanarts/define_files.php

                        so jetzt gib dort in das Formular einen Dateinamen an den es eigentlich gar nicht gibt (z.B.: test oder bild). Dann wird PHP dir eine Fehlermeldung ausspucken, die ich gerne ausblenden würde.

                        Vielleicht erläutert dies meine Frage ei wenig mehr

                        MFG

                        Wolfgang Peterknecht

                        1. Hallo Wolfgang Peterknecht,

                          http://www.visionofescaflowne.de/scripts/fanarts/define_files.php

                          so jetzt gib dort in das Formular einen Dateinamen an den es eigentlich gar nicht gibt (z.B.: test oder bild). Dann wird PHP dir eine Fehlermeldung ausspucken, die ich gerne ausblenden würde.

                          Diese Fehlermeldung hat aber nichts mit dem falschen Dateinamen zu tun, den irgendwer in das Formular eingibt, sondern mit Deiner ungenügenden Prüfung.
                          Lass Dir mal den Inhalt von $_FILES mit print_r() ausgeben. Dann siehst Du vielleicht eher, welche Schlüssel Du zur Prüfung des Uploads verwenden solltest.

                          Gruß Alex

                          --
                          >> Dass in eine if Schleife zu packen schafft mein 10 jähriges Patenkind. [...]
                          > Mhhh, wenn man if in Schleifen packt, muss man sich auch nicht wundern, wenn die Patenkinder verwöhnte Luder werden. [...]
                          [TomIRL und Tom in ?t=64084&m=364291]
                          ss:) zu:} ls:} fo:| de:[ va:| ch:| sh:( n4:& rl:° br:& js:| ie:| fl:| mo:}
                          1. Hallo AlexBausW,

                            ich habe mir mal den Inhalt der Vaiablen $_FILES ausgeben lassen. Rausgekommen ist ein Zahlensalat lol:

                            Array ( [localfile] => Array ( [name] => Array ( [0] => char_allen.jpg [1] => [2] => [3] => [4] => [5] => ) [type] => Array ( [0] => image/pjpeg [1] => [2] => [3] => [4] => [5] => ) [tmp_name] => Array ( [0] => /tmp/phpdRB4uM [1] => [2] => [3] => [4] => [5] => ) [error] => Array ( [0] => 0 [1] => 4 [2] => 4 [3] => 4 [4] => 4 [5] => 4 ) [size] => Array ( [0] => 5110 [1] => 0 [2] => 0 [3] => 0 [4] => 0 [5] => 0 ) ) )

                            mir ist schon klar was dies zu bedeuten hat nur leider weis ich nicht warum dies meine Frage beantworten soll.

                            MFG

                            Wolfgang Peterknecht

                            1. Hallo Wolfgang Peterknecht,

                              ich habe mir mal den Inhalt der Vaiablen $_FILES ausgeben lassen. Rausgekommen ist ein Zahlensalat lol:

                              Wenn Du es zwischen <pre> und </pre> gepackt oder aus dem Quelltext kopiert hättest, würde es nicht so nach "Salat" aussehen.

                              Ich habe mir mal die Mühe gemacht, das zu formatieren und von überflüssigen Angaben zu befreien:

                              Array (
                                 [localfile] => Array (
                                                   [name]     => Array (
                                                                    [0] => char_allen.jpg
                                                                 )
                                                   [type]     => Array (
                                                                    [0] => image/pjpeg
                                                                 )
                                                   [tmp_name] => Array (
                                                                    [0] => /tmp/phpdRB4uM
                                                                 )
                                                   [error]    => Array (
                                                                    [0] => 0
                                                                 )
                                                   [size]     => Array (
                                                                    [0] => 5110
                                                                 )
                                                )
                              )

                              mir ist schon klar was dies zu bedeuten hat nur leider weis ich nicht warum dies meine Frage beantworten soll.

                              Vielleicht wird es ja jetzt offensichtlicher, worauf ich hinaus wollte, vor allem wenn Du noch http://de.php.net/manual/de/features.file-upload.php zu Rate ziehst. Dann siehst Du sicherlich ein, daß man mit (auch wieder freundlicherweise für Dich formatiert):

                              if ( file_exists( $_FILES['localfile']['name'][0] ) ) {

                              ^^^^

                              $size1 = GetImageSize(   $_FILES['localfile']['tmp_name'][0] );

                              ^^^^^^^^

                              }

                              if ( $size1[2] == "1" ) {
                                    echo( "Es ist ein GIF!" );
                              }
                              else {
                                    echo( "Es ist kein GIF!" );
                              }

                              nicht die Existenz einer hochgeladenen Datei prüfen kann.

                              Gruß Alex

                              P.S.: Es wäre (sicherlich nicht nur) imho hilfreich, wenn Du Deinen Code und Deine Ausgaben besser formatieren würdest, damit der geneigte Helfer nicht "überfordert" wird und deshalb gleich von Hilfe absieht.

                              --
                              >> Dass in eine if Schleife zu packen schafft mein 10 jähriges Patenkind. [...]
                              > Mhhh, wenn man if in Schleifen packt, muss man sich auch nicht wundern, wenn die Patenkinder verwöhnte Luder werden. [...]
                              [TomIRL und Tom in ?t=64084&m=364291]
                              ss:) zu:} ls:} fo:| de:[ va:| ch:| sh:( n4:& rl:° br:& js:| ie:| fl:| mo:}
                              1. Nochmalmich,

                                So sollte es aussehen:

                                $_FILES['localfile']['tmp_name'][0] );

                                ^^^^^^^^
                                M***-Textareaumbrüche ;)

                                Gruß Alex

                                --
                                >> Dass in eine if Schleife zu packen schafft mein 10 jähriges Patenkind. [...]
                                > Mhhh, wenn man if in Schleifen packt, muss man sich auch nicht wundern, wenn die Patenkinder verwöhnte Luder werden. [...]
                                [TomIRL und Tom in ?t=64084&m=364291]
                                ss:) zu:} ls:} fo:| de:[ va:| ch:| sh:( n4:& rl:° br:& js:| ie:| fl:| mo:}
  2. Moin Wolfgang,

    Gibt es da eine Überprüfung ob der Pfad existiert ? Man könnte

    ergänzend zu Wilhelm, die Prüfung ob ein Verzeichnis existiert:

    if ( is_dir ($Pfad) )

    Grüße
    Mike