Simon: Upload

Hi,
auf meiner Homepage Habe ich ein Upload formular. Das PRoblem ist aber dass die Datein die Hochgeladen werden einfach in den Website Ordner hineinkopiert werden. Gibt es eine Möglichkeit die Datein immer in einen Eigenen Ordner zu kopieren. z.B. Wenn die datei am 20.9.2008 um 20:00 hochgeladen wird heißt dann der Ordner 20-9-08-20-00.

Hier das Upload script:
<?php

$max_byte_size = 2097152;
$allowed_types = "(jpg|jpeg|gif|bmp|png|txt)";

if($_POST["submit"] == "Upload") {

if(is_uploaded_file($_FILES["file"]["tmp_name"])) {

if(preg_match("/." . $allowed_types . "$/i", $_FILES["file"]["name"])) {

if($_FILES["file"]["size"] <= $max_byte_size) {

if(copy($_FILES["file"]["tmp_name"], $_FILES["file"]["name"])) {

}
else {

echo "Datei konnte nicht hochgeladen werden.";

}

}
else {

echo "Die Datei darf nur eine Größe von " . $max_byte_size . " Byte besitzen.";

}

}
else {

echo "Die Datei besitzt keine ungültige Endung.";

}

}
else {

echo "Keine Datei zum Hochladen angegeben.";

}

}
else {

echo "Bitte benutzen Sie das Upload Formular.";

}

?>

Mit freundlichen Grüßen
Simon

  1. Hi Simon,

    if(copy($_FILES["file"]["tmp_name"], $_FILES["file"]["name"])) {

    Du sagst Deinem Skript selber explizit, es moege die Datei in $_FILES["file"]["name"]
    speichern (das ist der Originalname der Datei). Wenn Du sie woanders speichern willst, dann lege ggf. Verzeichnisse an und speichere die Datei darin.

    Zwei Hinweise noch:
    1.: Zum Speichern hochgeladener Dateien gibt es die Funktion move_uploaded_file.
    2.: Dein if-else-Bauwerk ist, wie ich finde, ziemlich abenteuerlich. Eventuell waere das hier interessant fuer Dich(?).

    Viele Gruesse
    der Bademeister

    1. Hi Simon,

      if(copy($_FILES["file"]["tmp_name"], $_FILES["file"]["name"])) {

      Du sagst Deinem Skript selber explizit, es moege die Datei in $_FILES["file"]["name"]
      speichern (das ist der Originalname der Datei). Wenn Du sie woanders speichern willst, dann lege ggf. Verzeichnisse an und speichere die Datei darin.

      Zwei Hinweise noch:
      1.: Zum Speichern hochgeladener Dateien gibt es die Funktion move_uploaded_file.
      2.: Dein if-else-Bauwerk ist, wie ich finde, ziemlich abenteuerlich. Eventuell waere das hier interessant fuer Dich(?).

      Viele Gruesse
      der Bademeister

      Hi,
      Danke für die Hilfe. Da ich von PHP keine Ahnung hab (Ich hab bis jezt nur mit Html und css gearbeitet) hab ich mir das Script aus einem Tutotial zusammengebastelt.
      Werde mal den link ausprobieren

      MFG
      Simon

  2. Hello,

    if(copy($_FILES["file"]["tmp_name"], $_FILES["file"]["name"])) {

    Das ist prinzipiell gefährlich. Hier fehlt die explizite Pfadangabe für das persistente Abspeichern und außerdem wird einer Usereingabe $_FILES["file"]["name"] blind vertraut.

    Ersten sollen die Files doch wohl kaum im aktuellen Arbeitsverzeichnis [siehe ->pwd()] gepeichert werden und auch nicht in einem beliebigen, vom Benutzer bestimmbaren Pfad, oder?

    http://www.php.net/manual/de/function.basename.php

    und außerdem sollte man als erstes fragen:

    if(isset($_FILES[$uploadfiledname]['error'] and $_FILES[$uploadfiledname]['error']===0))
         {
             ## alles OK, es kann weitergearbeitet werden

    }

    Liebe Grüße aus Syburg bei Dortmund

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hi,

      if(isset($_FILES[$uploadfiledname]['error'] and $_FILES[$uploadfiledname]['error']===0))

      wozu isset()?
      if($_FILES[$uploadfiledname]['error']) Fehlermeldung();
      sollte doch ausreichen, wenn zuvor geprüft wurde, ob ein Upload stattgefunden hat, oder?

      freundliche Grüße
      Ingo

      1. Hi,

        if(isset($_FILES[$uploadfiledname]['error'] and $_FILES[$uploadfiledname]['error']===0))
        wozu isset()?
        if($_FILES[$uploadfiledname]['error']) Fehlermeldung();
        sollte doch ausreichen, wenn zuvor geprüft wurde, ob ein Upload stattgefunden hat, oder?

        freundliche Grüße
        Ingo

        Hi,
        wenn ich ehrlich bin keine Ahnung. Wie schon ich vorher schon gesagt hab bin ich ganz neu im Gebiet. Hab noch nie etwas mit Php gemacht.
        MFG
        Simon

      2. Hello,

        if(isset($_FILES[$uploadfiledname]['error'] and $_FILES[$uploadfiledname]['error']===0))
        wozu isset()?

        if($_FILES[$uploadfieldname]['error']) Fehlermeldung();
        sollte doch ausreichen, wenn zuvor geprüft wurde, ob ein Upload stattgefunden hat, oder?

        Nein. Ich sagte ja, dass man dies als erstes prüfen soll.

        Es könnte sein, dass gar kein $_FILES-Array vorhanden ist. Gründe gibt es einige.
        Es könnte sein, dass $_FILES[$uploadfieldname]['error'] ein Array ist.
        Dann liegt aber noch lange kein Fehler vor.
        Dazu müsste man dann das Konzept besprechen, also Zusammenspiel zwischen HTML-Dokument am Client und PHP-Script am Server.

        Die Prüfung auf 'identisch 0' ist hier einfach richtig.

        Liebe Grüße aus Syburg bei Dortmund

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hi,

          wozu isset()?

          if($_FILES[$uploadfieldname]['error']) Fehlermeldung();
          sollte doch ausreichen, wenn zuvor geprüft wurde, ob ein Upload stattgefunden hat, oder?

          Nein. Ich sagte ja, dass man dies als erstes prüfen soll.

          ich prüfe das eingangs über if(isset($_FILES['Feldname'])) und dann sollten doch weitere isset() überflüssig sein.

          Es könnte sein, dass $_FILES[$uploadfieldname]['error'] ein Array ist.
          Dann liegt aber noch lange kein Fehler vor.

          Stimmt - aber dann müssten mehrere Dateien übertragen worden sein (was unerwünscht wäre und im übrigen auch bei Deinem Vergleich ja als Fehler gewertet würde!) und $_FILES["file"]["tmp_name"] ebenfalls ein Array sein und damit durch die Prüfung fallen, oder nicht?
          Abgesehen davon liefert die simple Abfrage if($Variable) bei einem Array sowieso immer true, so dass im obigen Beispiel Fehlermeldung() aufgerufen würde.

          Die Prüfung auf 'identisch 0' ist hier einfach richtig.

          ich habe nicht gesagt, dass sie falsch wäre, sondern nur überflüssig. Und wenn $_FILES[$uploadfieldname]['error'] ein Array sein sollte, dann wäre auch diese Prüfung ungenügend zur Ausgabe einer zutreffenden Fehlermeldung.
          Meine Beispielfunktion Fehlermeldung() könnte allerdings eine Abfrage if(is_array(...)) enthalten... ;-)

          • Enthält sie zwar noch nicht, aber dank Deinem Hinweis werde ich das gleich mal hinzufügen.

          freundliche Grüße
          Ingo