Eric: Datei-Upload

Beitrag lesen

So, mithilfe einiger Forenbeiträge und eigener Recherche hab ich nun ein bei mir funktionierendes Script für einen einfachen Dateiupload auf die Beine gestellt.
Für ein Änfänger wie mich waren das mehrere Stunden Arbeit :P

Einiges im Code könnte man sicher eleganter lösen, aber gibt es grundsätzliche Fehler?

Ich hab alles komplett kommentiert, damit dürfte es nicht zu schwer sein die Zusammenhänge zu erkennen.

Hinweis: Das Script ist nur für einen internen Bereich auf einer Seite gedacht. Böswillige Schädigungsversuche wird es also kaum geben, höchstens versehentliche.
Falls ein Dateiname durch fehlende Konvertierung von seltenen Sonderzeichen nicht so schön aussehen würde ist das egal, solange es keine dauerhaften Fehler auf dem Server auslöst.
Ich würde die Leute schon anweisen, passende Namen zu benutzen.

Hier nun endlich der Code:

<?php header("Content-type:text/html;charset=utf-8"); ?>  
<html>  
<head>  
<title>Dateiupload-Test</title>  
</head>  
<body>  
  
<?php  
  
  
if (isset($_POST['submit']) && $_POST['submit']=="Senden") // Wurde was abgeschickt?  
  {  
  $uploadversuch = true;     //Formular wurde abgesendet  
  $uploadfertig = false;     //Aber im Verzeichnis sind sie noch nicht...  
  }  
  
  
$oname = $_FILES['datei']['name'];  
  
$replacearray = array("ä" => "ae", "ö" => "oe", "ü" => "ue", "ß" => "ss", "$" => "s", "ÄE" => "A", "Ö" => "OE", "Ü" => "UE", "&" => "and");  
$oname = strtr($oname, $replacearray);  
$oname = strtolower($oname);  
  
$dateiname = substr($oname, 0, strripos($oname, '.')); //Alles nach dem letzten Punkt wird weggeschnitten  
$dateiendung = substr($oname, strlen($dateiname)); // Der Dateiname wird weggeschnitten indem die Länge des Strings aus der vorigen Operation genutzt wird --> nur noch Endung mit Punkt  
$endung_ohne_punkt = substr($oname, strlen($dateiname) +1); //Die Dateiendung ohne den Punkt für einfacheren array  
  
$erlaubte_endungen = array("jpg", "jpeg", "gif", "png", "bmp", "psd", "txt", "rar", "zip", "7z", "mp3", "wav", "ogg"); // bei Bedarf zu ergänzen, hauptsache kein .php und co  
  
if(!in_array($endung_ohne_punkt, $erlaubte_endungen)) // Prüfen ob die Endung in Ordnung geht, ansonsten Upload abbrechen und Fehlermeldung generieren.  
  {  
  $uploadversuch = false;  
  $falsche_endung = true;  
  }  
  
if($_FILES['datei']['size'] > 10000000) // Dateigröße überprüfen, falls zu groß Upload abbrechen und passende Fehlermeldung setzen  
  {  
  $uploadversuch = false;  
  $zu_gross = true;  
  }  
  
  
  
// Zufallszahl durch Unix-Zeitstempel. Bei Bedarf könnte man das Upload-Datum der Datei zuverlässig feststellen.  
  
$zufall = "_". time() ."";  
  
  
  
$fullname = "$dateiname$zufall$dateiendung"; //zu einem Namen zusammenfügen  
  
if ($uploadversuch && isset($_FILES['datei']['tmp_name']) && move_uploaded_file($_FILES['datei']['tmp_name'],"data/$fullname"))  
  {  
  $uploadfertig = true;  
  }  
  
  // Falls es einen Uploadversuch gab, die Datei auf dem Server aufgetaucht ist, ins Verzeichnis Data geschoben wurde und den alten Namen + Zufallszahlen + Endung bekommen hat, dann hats funktioniert  
  
?>  
  
  <form enctype="multipart/form-data" action="<?php echo htmlspecialchars ($_SERVER['PHP_SELF']); ?>" method="post">  
  <input type="hidden" name="max_file_size" value="10000000">  
  Datei auswählen:<br> <input name="datei" type="file"><br><br>  
  <input type="submit" value="Senden" name="submit">  
  </form>  
  <br><br>  
  
<?php  
  
//Das wars Formular zum Upload, dürfte klar sein  
  
  
  
// Nachricht ausgeben:  
  
 if (isset($_POST['submit']) && $_POST['submit']=="Senden" && !$uploadfertig &&!$falsche_endung && !$zu_gross) // Es wurde was abgeschickt, aber die Datei ist nicht bis zum Ziel gekommen. Dabei waren nicht Größe oder Name schuld.  
  {  
  echo "Der Upload ist aus unbekannten Gründen leider fehlgeschlagen. Kontaktieren Sie den Admin unter xy@mail.com";  
  }  
  elseif ($uploadfertig) // Alles paletti  
   {  
   echo "Der Upload ist gelungen, die Datei <b>", $_FILES['datei']['name'] ,"</b> ist nun im Verzeichnis.<br> Sie ist unter dem Pfad <a href=\"http://x-y.com/abc/data/", $fullname ,"\">http://x-y.com/abc/data/", $fullname ,"</a> erreichbar.";  
   }  
  elseif (isset($_POST['submit']) && $_POST['submit']=="Senden" && empty($_GET['datei'])) // Wurde da etwas nichts gewählt?  
   {  
   echo "Es muss eine Datei ausgewählt werden!";  
   }  
  elseif (isset($_POST['submit']) && $_POST['submit']=="Senden" && !$uploadversuch && $falsche_endung) // Nana, nichts Verbotenes hochladen...  
   {  
   echo "Diese Dateiendung ist nicht erlaubt!";  
   }  
   elseif (isset($_POST['submit']) && $_POST['submit']=="Senden" && !$uploadversuch && $zu_gross) // Falls es zu groß war  
   {  
   echo "Die Dateigröße darf 10 Megabyte nicht überschreiben!";  
   }  
  
  
  
  
?>  
  
</body>  
</html>

Gruß Eric

0 48

Datei-Upload

Eric
  • php
  1. 0
    frankx
    1. 0
      paierlep
      1. 0
        frankx
        1. 0
          Malcolm Beck´s
          1. 0
            frankx
            1. 0
              Malcolm Beck´s
              1. 0
                dedlfix
                1. 0
                  Malcolm Beck´s
                  1. 0
                    dedlfix
                    1. 0
                      Malcolm Beck´s
                      1. 0

                        Frameworks

                        dedlfix
                        1. 0
                          Malcolm Beck´s
                          1. 0
                            dedlfix
                            1. 0
                              Malcolm Beck´s
                              1. 0
                                frankx
                                1. 0
                                  at
                                  1. 0

                                    Zend-Framework - wie gemeinsam Artikel erstellen?

                                    frankx
                                2. 0
                                  Malcolm Beck´s
                                  1. 0
                                    dedlfix
                                    1. 0
                                      frankx
                                      1. 0
                                        Malcolm Beck´s
                                        • menschelei
                                        1. 0
                                          Malcolm Beck´s
                                          • php
                                          1. 0
                                            dedlfix
                                            1. 0
                                              Malcolm Beck´s
                                              1. 0
                                                dedlfix
                                                1. 0
                                                  Malcolm Beck´s
                                                  1. 0
                                                    dedlfix
                                                    1. 0
                                                      Malcolm Beck´s
                                                      1. 0
                                                        dedlfix
                                                        1. 0
                                                          Malcolm Beck´s
                                                          1. 0
                                                            dedlfix
                                                            1. 0
                                                              Malcolm Beck´s
                                              2. 0
                                                frankx
                                          2. 0
                                            frankx
    2. 0
      Eric
      1. 0
        frankx
        1. 0
          Eric
      2. 0

        Datei-Upload - Verzeichnis und Rechtevergabe

        frankx
        1. 0
          dedlfix
          1. 0
            frankx
            1. 0
              dedlfix
  2. 0
    Rouven
    1. 0
      frankx
  3. 0
    Eric
    1. 0
      dedlfix
      1. 0
        Eric
        1. 0
          dedlfix