Bilder Upload

  • Hey zusammen,


    ich habe ein Bilderupload erstellt. Funktioniert auch.

    Ein Problem habe ich dennoch. Wenn ich nun überprüfen möchte ob der index bild leer ist kommt nie die Fehlermeldung, obwohl man nix abgesendet hat. Oder es kommt die Fehlermeldung aber diese bleibt dauerhaft bestehen. Ich weiß nich warum das so ist...


    Mein Code:


    Eine weiter Frage habe ich. Was haltet ihr davon wenn man die Dateipfade zu den Bildern in die DB speichert ?


    Gruß,

    Stef

  • Zum leeren Index kann ich noch nichts sagen, das muss ich mir noch ansehen.


    ABER:

    1. Einige Kleinigkeiten im HTML wären zu korrigieren (body-Tag an falscher Stelle, 500KB-Angabe stat 1,024MB).

    2. $_FILES[][type] soll zwar den mime-Typ angeben, doch PHP.net selbst gibt an:

    Zitat

    $_FILES['userfile']['type']

    The mime type of the file, if the browser provided this information. An example would be "image/gif". This mime type is however not checked on the PHP side and therefore don't take its value for granted.

    Konsequenterweise sollte man [type] also aus dem Gebrauch streichen und die notwendigen Prüfungen anders vornehmen (siehe mein Beitrag dazu hier).


    3. Mit deinem Code prüfst du auch nicht den MIME-Type, sondern das Suffix. Da solltest du dann auch entsprechend passende Variablennamen für nehmen: $mime_type legt nahe, dass es um den MIME-Typ geht und eben nicht nur um das Suffix.


    4. Ich bin ein Fan von Speichern der Bilddateinamen. Die Pfade mit in die DB zu schreiben eher nicht; hier macht m. E. eine einzige Variable, die leicht zu ändern ist, für mich viel mehr Sinn.



    Soweit erstmal beim flüchtigen Drüberhuschen :)


    edit:

    zu 4.: Natürlich nur, wenn es 1 Bilderordner ist. Sind die Bilder in vielen verschiedenen Ordnern, womöglich noch mit Unterordnern, kann das Speichern der Pfade evtl. sinnvoller sein. Aber das will dann auch gepflegt werden. ;)

  • Du prüfst als erstes, ob if (isset($_FILES['bild'])).

    Die abfrage, ob if (empty($_FILES['bild'])) liegt innerhalb des isset.

    Wenn kein Bild hochgeladen würde, käme das Script an dem ersten isset gar nicht erst vorbei.


    Probier mal das hier:

    Das else ist neu.

    Der $error[] = ... wurde in dieses else verschoben.

  • Hey,


    Jav : Ok. Alles klar. Habe jetzt um den suffix (das suffix ist dann z.b. .jpg, .png, .... ?) zu bestimmen die function exif_imagetype() benutzt. In diese soll der Name der Bilddatei rein. Habe ich nun auch so gemacht :


    PHP
    1. $name = $_FILES['bild']['name'];
    2. $datei_endung = exif_imagetype($name);

    Nun kommt aber jedes mal folgende Fehlermeldung :

    Warning: exif_imagetype(turm_schwarz.jpg): failed to open stream: No such file or directory in G:\xampp\htdocs\bilder_upload\bilder_upload.php on line 37

    In dieser Zeile liegt die variable datei_endung. Ok ich denke auch, dass wenn man z.b. mehrer Bilderordner hat (verschiedener Themen, für verschiedene Sachen), dass man den Pfad mit den bilder namen in die db speichert.


    Habe schon nach der Warnung geschaut. Da wird gesagt, dass man den realen Pfad mal mit der function realpath() ermitteln soll. Habe ich jetzt auch gemacht und dies kommt da raus: G:\xampp\htdocs\bilder_upload . Das ist nicht der ordner, den ich als Speicherordner (wo die Bilder rein kommen) angegeben habe. So sollte die Verzichnissstruktur aussehen : G:\xampp\htdocs\bilder_upload\bilder\


    cottton : Mhm... stimmt ja. Danke :)


    Stef

  • Um den Fehler nachzubauen, müsste man wissen, von wo aus du das Uploadscript aufrufst. Ich denke mal, es liegt lediglich am fehlenden Pfad. Also müsste das ungefähr so aussehen:

    $datei_endung = exif_imagetype("pfad/zum/passenden/Ordner/$name");


    Das Suffix ist die Dateinamenserweiterung. Wikipedia sagt ohne den trennenden Punkt. Je nach Vorgehensweise kann man Prüfungen aber auch mit dem Punkt machen, weil die letzten 3 Zeichen von .txttxt eben auch "txt" ergeben (das Suffix ist natürlich txttxt).

  • Hey,


    vielen Dank. Hab es nun hinbekommen. :)


    EDIT: Beim Überprüfen ob ein Bild gesendet wurde habe ich nicht die else-Variante genommen, weil der error dann sofort ausgegeben wird nach dem wiederladen der Seite.


    Habe es so umgesetzt :

    PHP
    1. $files_error = isset($_FILES['bild']['error']) ? $_FILES['bild']['error'] : null;
    2. if ($files_error === 4) {
    3. echo '<p class="fehler">Bitte fügen sie ein Bild zum hochladen ein!</p>';
    4. }