Franky: Hochgeladen oder nicht....das ist hier die Frage...

Hallo,

ich habe einen Dateiupload a la
http://selfaktuell.teamone.de/artikel/phpasp/php-uploadcheck/index.htm
gebaut. Funktioniert eigentlich.
Aber nun will ich aber das das Skript vorher die datei überprüft (in meinem falle ist es ein jpg und ist es soundsogroß) und nicht erst nachdem sie es hochgeladen hat.
Ich verstehe bei der Anleitung bloß nicht genau in welchen Moment das file hochgeladen wird.
Wenn dies hier
if(!copy($thefile,"/pfad/zum/neuen/direktory/name.endung"))
geschieht dann könnte ich ja nicht wirklich vorher eingreifen.
Hm vielleicht kann mir ja einer von euch helfen.

  1. Hallo Franky,

    da PHP nur serverseitig läuft, findet die Prüfung, ob das Größenlimit und der Mimetyp eingehalten werden erst nach dem Hochladen statt. Es ist dann aber noch keinesfalls in deinem Zielverzeichnis, sondern befindet sich in einem temporären Verzeichnis. Erst wenn deine Prüfung abgeschlossen ist und die Datei deinen Wünschen entspricht verschiebst du sie in das Zielverzeichnis.

    Evtl. kann man einen clientseitige Prüfung per JavaScript realisieren, kenne mich aber mit JS zu wenig aus um dir da weiter zu helfen.

    Schönen Gruß aus dem verschneiten München

    die Knappschaft

  2. Hallo Franky

    Das PHP Script kann die Dateigröße erst ermitteln, wenn die Datei schon hochgeladen wurde, da es auf dem Server ausgeführt wird, wenn das Formular und damit die Datei vollständig hochgeladen ist.
    Damit keine zu großen Dateien hochgeladen werden, kannst du nur hoffen, dass der Browser die Angabe
    <input type="hidden" name="max_file_size" value="1000">
    versteht. Eine andere Möglichkeit gibt es nicht. Um zu verhindern dass Dateien hochgeladen werden die keine jpg Dateien sind, kannst du mit JavaScript die Dateiendung überprüfen. Das Script müsste dann ausgeführt werden, nachdem man die Datei ausgewählt hat und bevor das Formular versand wird. Als Eventhandler sind dann sinnvoll onChange im input Tag oder onSubmit im form Tag, wobei ich die zweite Variante angenehmer finde. Das Script müsste also den Dateinamen lesen, indem es mit document.formularname.elementname.value darauf zugreift. Dann mit der Methode lastIndexOf() das letzte Vorkommen des Punktes ermitteln und mit der Methode substring() die Dateiendung vom Punkt bis zum Ende des Dateinamens ermitteln. Dann diesen String in Kleinbuchstaben umwandeln mit toLowerCase() und mit jpg und jpeg vergleichen. Ist eine ungewollte Datei angegeben, so kann man den Benutzer mit alert() darauf hinweisen und sollte das Versenden des Formulars verhindern, indem man den onSubmit Handler mit return false beendet. (onSubmit="return check()" und function check() { if(x!='jpg')    return false; })

    Es kann aber passieren, dass trotzdem eine ungewollte Datei gesandt wird. Diese wird temporär gespeichert und das PHP-Script muss entscheiden, ob es die Datei an einen sicheren Ort kopiert oder 'verfallen' lässt. Du musst also, wie im Beispiel auch kurz erwähnt, überprüfen ob die Dateigröße klein genug ist, ob der Mimetyp stimmt(siehe Beispiel) und, wie vorher mit JavaScript, nochmals überprüfen ob die Dateiendung erlaubt ist(dafür gibt es bei php sicher eine eigene Funktion). Obwohl bis hier eigentlich alle Fehleingaben berücksichtigt sein sollten, solltest du noch prüfen, ob es sich wirklich um ein Bild handelt. (Eine Datei mit der Endung .jpg muss nicht zwangsweise eine JPEG Datei sein.) Der Autor des Artikel hat auch gezeigt, wie das geht.

    cu.Lukas