kungschu: Fehlerbehandlung in upload-Script

Hallo.

Die Fehlerbehandlung meines upload-Scripts funktioniert nicht ganz korrekt, die Ursache kann ich im Moment nicht erkennen, Fehlermeldung wird, trotz E_ALL, keine ausgegeben.

Das Formular:

  
 <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">  
 <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $max_file_size ?>">  
 <input type="file" name="userfile"><br><br>  
 <input type="submit" value="Bild hochladen">  

Die if-Abfrage:

  
 if (preg_match('~.jpg|jpeg|.gif|.png~i', substr($_FILES['userfile']['name'], -4)) AND $_FILES['userfile']['size']<=$max_file_size) {  
  
 // upload  
  
 }else{  
  
 // Fehlerbehandlung  
  
 }  

Mit der if-Abfrage überprüfe ich Format und Größe der Datei und reagiere entsprechend. Allerdings wird die Fehlerbehandlung nur bei falschem Dateiformat, nicht aber bei falscher Größe aufgerufen. Wo liegt mein (logischer) Fehler?

Danke.

MfG, Kungschu.

--
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
  1. echo $begrüßung;

    Die Fehlerbehandlung meines upload-Scripts funktioniert nicht ganz korrekt, die Ursache kann ich im Moment nicht erkennen, Fehlermeldung wird, trotz E_ALL, keine ausgegeben.

    Fehler bekommt man nicht immer auf dem Silbertablett serviert, sprich: durch Ausgabe einer Meldung angezeigt.

    if (preg_match('~.jpg|jpeg|.gif|.png~i', substr($_FILES['userfile']['name'], -4))
    Mit der if-Abfrage überprüfe ich Format und Größe der Datei und reagiere entsprechend.

    Mit dem ersten Teil der Bedingung prüfst du kein Format sondern nur einen Teil des Dateinamens. Wenn du Bilddateien erwartest, solltest du getimagesize() darauf anwenden und prüfen, ob ein Array mit Daten oder false (nebst Warnung) zurückgeliefert wird.

    Allerdings wird die Fehlerbehandlung nur bei falschem Dateiformat, nicht aber bei falscher Größe aufgerufen. Wo liegt mein (logischer) Fehler?

    Suche die Ursache in den Inhalten der Variablen. Lass dir deren Inhalt ausgeben und vergleiche das Tatsächliche mit dem Erwarteten.

    <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $max_file_size ?>">

    Diese Angabe ist überflüssig, da sich sowieso kein Client dran hält.

    echo "$verabschiedung $name";

    1. Hallo dedlfix.

      if (preg_match('~.jpg|jpeg|.gif|.png~i', substr($_FILES['userfile']['name'], -4))
      Mit der if-Abfrage überprüfe ich Format und Größe der Datei und reagiere entsprechend.

      Mit dem ersten Teil der Bedingung prüfst du kein Format sondern nur einen Teil des Dateinamens. Wenn du Bilddateien erwartest, solltest du getimagesize() darauf anwenden und prüfen, ob ein Array mit Daten oder false (nebst Warnung) zurückgeliefert wird.

      Wieso ziehst du getimagesize() dieser Methode mit preg_match vor?

      Suche die Ursache in den Inhalten der Variablen. Lass dir deren Inhalt ausgeben und vergleiche das Tatsächliche mit dem Erwarteten.

      <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $max_file_size ?>">

      Diese Angabe ist überflüssig, da sich sowieso kein Client dran hält.

      Hmm, ich bin mir nicht sicher. Auf deinen Rat hin habe ich festgestellt, dass, wenn <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $max_file_size ?>"> im Formular vorhanden ist, bei zu großen Dateien echo $_FILES['userfile']['size']; null anstatt der tatsächlichen Größe ausgibt. Verzichte ich auf das hidden-Feld, wird die tatsächliche Größe ausgegeben und mein upload-Script funktioniert nun auch wie gewünscht.

      Wie erklärst du dir besagtes Verhalten?

      Danke dir.

      MfG, Kungschu.

      --
      Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
      1. echo $begrüßung;

        Mit dem ersten Teil der Bedingung prüfst du kein Format sondern nur einen Teil des Dateinamens. Wenn du Bilddateien erwartest, solltest du getimagesize() darauf anwenden und prüfen, ob ein Array mit Daten oder false (nebst Warnung) zurückgeliefert wird.

        Wieso ziehst du getimagesize() dieser Methode mit preg_match vor?

        Namen sind Schall und Rauch. Der Dateiname muss nicht unbedingt mit dessen Inhalt übereinstimmen. Prüfe den Inhalt und verlass dich nicht darauf, was andere auf das Paket geschrieben haben,

        <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $max_file_size ?>">
        Wie erklärst du dir besagtes Verhalten?

        Ich brauch grad keine Erklärung dazu :-), aber das Kapitel Handling file uploads beschäftigt sich ausführlich damit.

        echo "$verabschiedung $name";

        1. Hallo.

          Danke dir für deine Beiträge.

          MfG, Kungschu.

          --
          Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
      2. hi,

        Wieso ziehst du getimagesize() dieser Methode mit preg_match vor?

        Weil, wie er schon sagte, dein preg_match sich nur den Dateinamen anschaut - und auch Dateinamen sind Schall und Rauch - niemand hindert mich daran, einem Script, einer ausführbaren Datei oder sonstwas die Endung .jpg oder .gif zu geben.

        getimagesize hingegen versucht, den Dateinhalt als Bild zu interpretieren - daraus, dass das ggf. fehlschlägt, kannst du also einen viel geeigneteren Schluss ziehen, als aus ein paar Buchstaben in einem Namen.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Hallo.

          Weil, wie er schon sagte, dein preg_match sich nur den Dateinamen anschaut - und auch Dateinamen sind Schall und Rauch - niemand hindert mich daran, einem Script, einer ausführbaren Datei oder sonstwas die Endung .jpg oder .gif zu geben.

          Ok. Schall und Rauch. ;)

          Danke.

          MfG, Kungschu.

          --
          Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
      3. Hallo kungschu,

        Wieso ziehst du getimagesize() dieser Methode mit preg_match vor?

        Die Schall- und Rauch-Erklaerung hast du ja schon paarmal gehoert. Ich moechte noch anfuegen, dass, wenn PHP eine Funktion fuer einen bestimmten Zweck anbietet, es normalerweise keine gute Idee ist, diese von Hand nachzubauen, weil das i.d.R. weniger performant ist, insbesondere, wenn regulaere Ausdruecke im Spiel sind. Im Prinzip duerfte das fuer die meisten Sprachen gelten.

        Gruß,

        Dieter

        1. Hallo Dieter.

          Danke auch dir für die Anmerkung. Ich habe es nun wie folgt gelöst:

            
             $file = getimagesize($_FILES['userfile']['tmp_name']);  
            
             if ($file[2]>0 AND $file[2]<5 AND $_FILES['userfile']['size']<=$max_file_size) {  
            
             // usw.  
          
          

          Konstruktive Kritik auch dazu natürlich willkommen.

          MfG, Kungschu.

          --
          Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
          1. echo $begrüßung;

            $file = getimagesize($_FILES['userfile']['tmp_name']);
               if ($file[2]>0 AND $file[2]<5 AND $_FILES['userfile']['size']<=$max_file_size) {

            getimagesize() ist eine der wenigen Funktionen, die unbedingt einen Fehlerunterdrückungsoperator @ vornan haben sollte, denn im Fehlerfall kommt eine Warnmeldung, die sich nicht deaktivieren lässt. Außerdem ist im Fehlerfall der Inhalt von $file ein false und kein Array. Du bekommst dann die nächste Meldung. Frage vor dem weiteren Gebrauch von $file zunächst ab, ob es einem true entspricht, z.B. so: if ($file and $file[2]...

            echo "$verabschiedung $name";

            1. Hi,

              getimagesize() ist eine der wenigen Funktionen, die unbedingt einen Fehlerunterdrückungsoperator @ vornan haben sollte, denn im Fehlerfall kommt eine Warnmeldung, die sich nicht deaktivieren lässt.

              Der Fehlerfall tritt ein, wenn die Datei <12 Bytes ist. Das kann man vorher prüfen - sollte man auch, denn es gibt PHP-Versionen, wo PHP sich dann einfach verabschiedet ... :-/

              ... auf den @ kann man dann IMHO verzichten.

              Gruß, Cybaer

              --
              Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
              1. Hallo Cybaer,

                Ich bin auch fuer die Verwendung von @getimagesize(), denn aussser der 12 Byte -Grenze koennte es ja sein, dass das Bild nicht existiert (warum auch immer). Klar kann man das auch wieder mit is_file() oder sowas testen aber das ist halt wieder ein Extraschritt den getimagesize() miterledigen koennte.

                Gruß,

                Dieter

                1. Hi,

                  aber das ist halt wieder ein Extraschritt den getimagesize() miterledigen koennte.

                  Klar, aber bei mir kommen Dateien, die nicht existieren (die haben dann übrigens auch keine Dateigröße >=12 Bytes ;-)), erst gar nicht an eine Stelle, wo man damit arbeiten könnte. =;-)

                  Faktisch teste ich *immer* zuerst, ob eine Datei fr mich verwendbar ist (was beinhaltet: Existiert die Datei? Ist sie lesbar? Ist sie gelockt (ggf. waretn, bis sie es nicht mehr ist)? - um sie dann ggf. zu locken - und *zuletzt* drauf zuzugreifen).

                  Und AFAIR war bei der PHP-Version (irgendeine 4er), bei mir der Bug mit den <12 Bytes auch nicht mit @ abfangbar. PHP hat's einfach zerrissen ...

                  ... und seitdem ...

                  Gruß, Cybaer

                  --
                  Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!