Übersicht » Einführung CSV
Bei dem auf dieser Seite vorgestellten Upload-Script handelt es sich
um eine spartanische Ausführung, die praktisch nur für Testzwecke eingesetzt werden sollte und eigentlich
nur zum besseren Verständnis des erweiterten Upload-Scripts gedacht ist.
Im HTML-Bereich des Scripts ist ein Upload-Formular enthalten, welches
gegenüber einem einfachen HTML-Formular einige Besonderheiten aufweist. So ist im einleitenden
Form-Tag das Attribut enctype enthalten, dem als Wert der MIME-Typ "multipart/form-data" zugewiesen
wurde. Ohne die Angabe des MIME-Types würde nur der ausgewählte Dateiname, nicht jedoch das
eigentliche Bild zum Server übertragen.
Weiterhin ist ein Input-Element mit dem Attribute-Werte-Paar type="file" enthalten, wodurch dem
Browser mitgeteilt wird, bei Benutzung die Auswahl einer lokalen Datei zu ermöglichen. Die zu
akzeptierenden MIME-Typen können dabei als Wert für das Attribut accept notiert werden, jedoch
übersehen die meisten Browser bislang wohl dieses Attribut, so dass eine Angabe praktisch keinen
Sicherheitsgewinn mit sich bringt.
Serverseitig wird zuerst vom Script mit Hilfe der superglobalen Variablen $_POST und $_FILES
überprüft, ob Daten vom Formular mit der HTTP-Request-Methode Post übermittelt wurden und eine Datei
ohne Fehler übertragen werden konnte. Falls der Upload erfolgreich ausgeführt werden konnte, enthält
$_FILES ein assoziatives Array, in dem als Schlüssel-Werte Paare der Name der Grafik, der MIME-Typ der
hochgeladenen Datei, der temporäre Name und Speicherort der Datei, die Anzahl der Fehler und die Größe
der hochgeladenen Datei in Bytes enthalten sind.
Array ( [name] => bildname.jpg [type] => image/jpeg [tmp_name] => C:\pfad\...0099.tmp [error] => 0 [size] => 59458 )
Ein weiteres Array liefert die Funktion getimagesize, welches neben den Maßen der Grafik und den MIME-Typ noch die Anzahl der Farbkanäle (3 für RGB) und die Anzahl von Bits pro Farbe als Werte enthält.
Array ( [0] => 525 [1] => 395 [2] => 2 [3] => width="525" height="395" [bits] => 8 [channels] => 3 [mime] => image/jpeg )
Im weiteren Verlauf der Abarbeitung des Scripts werden einige Werte aus
beiden Arrays überprüft. So wird im folgenden if-Statement der MIME-Typ der hochgeladenen Grafik mit
den beiden akzeptierten MIME-Typen JPEG und PNG verglichen und in einem weiteren if-Statement wird
abgefragt, ob eine Bilddatei die maximale Größe, die entsprechend vorgewählt werden kann, nicht
überschreitet.
Mit den PHP Funktionen trim(), strtolower(), strtr() und preg_replace() wird der ursprüngliche Name
der Datei für die weitere Verwendung aufbereitet. Dabei werden im ersten Schritt mit trim eventuell
vorhandene Leerzeichen vom Anfang oder Ende des übermittelten Dateinamens entfernt und mit strtolower
alle Großbuchstaben in Kleinbuchstaben umgewandelt.
Ob großgeschriebene Umlaute mit erfasst werden oder gegebenenfalls mit in dem Array der umzuwandelnden
Zeichen aufgenommen werden müssen, ist jedoch von den lokalen (locale) Einstellungen des Systems abhängig. Die
Umwandlung der Umlaute in einfache, aus Selbstlauten zusammengesetzte Doppellaute erfolgt mit der
PHP-Funktion strtr(), wobei gleichzeitig im Dateinamen enthaltene Leerzeichen durch einen Bindestrich
ersetzt werden. Durch diese Umwandlung würde aus einem Dateinamen wie
"Frühlingsbeginn im März.jpg"
der Dateiname
"fruehlingsbeginn-im-maerz.jpg".
Mit preg_replace wird der übergebende Dateiname letztendlich, einschließlich Punkt und Endung
(Dateinamenserweiterung oder Extension), auf unerlaubte Zeichen überprüft. Wurde kein unerlaubtes
Zeichen gefunden, so muss die Variable $pruefe als Wert einen leeren String mit 0 Zeichen enthalten.
Insoweit eine Image-Datei erfolgreich hochgeladen wurde und die Überprüfung keinen Fehler ergab, kann
nun die temporär zwischengespeicherte Datei mit der Funktion move_uploaded_file() ins eigentliche
Verzeichnis verschoben werden, um dort unter den aufbereiteten Dateinamen abgespeichert zu werden.
Auch diese Funktion überprüft noch einmal, ob es sich bei der zu verschiebenden Datei um eine gültige
Upload-Datei handelt, die mit der HTTP-Methode POST übermittelt wurde.
Im letzten Schritt werden die Daten als String aufbereitet, um diese in eine CSV-Datei zu schreiben,
wobei die Einträge in der CSV-Datei eine fortlaufende Nummer erhalten und den Bildern die
Größenangaben von width und height zugeordnet werden.
***
Wie Sie dieses Script nutzen und erweitern können, erfahren Sie auf den nächsten Seiten.
Kleines Upload-Script (upload-klein.php):
<!DOCTYPE html> <html> <head> <title>Kleines Upload-Script mit Formular</title> <link rel="stylesheet" type="text/css" href="galerie.css"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="robots" content="noindex,nofollow"> </head> <body style="text-align:center"> <h1>Kleines Upload-Script mit Formular</h1> <form action="upload-klein.php" method="post" enctype="multipart/form-data"> <input type="file" name="images" accept="image/*"> <input type="submit" name="upload" value="Senden"> </form> <?php error_reporting(E_ALL); // Nach Erprobung (0) $file = "kleine-galerie.csv"; // Name der CSV-Datei angeben if (isset($_POST["upload"]) and $_FILES["images"]["error"] == 0) { $imagef = $_FILES["images"]; $imsize = $imagef["size"]; $uplimg = getimagesize($imagef["tmp_name"]); $lfdnr = count(scandir("bilder/")) -1; /*--------------------------------------------------------------------- Überprüfung des Formats der übermittelten File und Überprüfung auf unerlaubte Zeichen oder zu viele Zeichen sowie auf Überschreitung der Größe der Datei in Bytes. 102400 Byte entsprechen 100 kB. ---------------------------------------------------------------------- */ if ($uplimg["mime"] == "image/jpeg" or $uplimg["mime"] == "image/png") { $imagen = strtolower(trim($imagef["name"])); $umlaut = array("ä"=>"ae","ö"=>"oe","ü"=>"ue","ß"=>"ss"," "=>"-"); $imagen = strtr($imagen, $umlaut); $pruefe = preg_replace("/[a-z0-9_-]+?\.(jpg|png)/i", "", $imagen); if (strlen($imagen) < 48) { if (strlen($pruefe) === 0 and $imsize < 102400) { move_uploaded_file($imagef["tmp_name"], "bilder/".$imagen); $eintrag = "bilder/".$imagen; /*-- Daten für CSV aufbereiten -------------------------------*/ $daten = "\"".$lfdnr."\";\"".$eintrag."\";\"".addslashes($uplimg[3])."\"\n"; /*-- Daten in CSV schreiben ----------------------------------*/ file_put_contents($file, $daten, FILE_APPEND|LOCK_EX); /*-- Für die Ausgabe von eigenen Fehlermitteilungen --------------*/ } else {echo "Es handelt sich um kein JPG oder PNG oder das Bild ist zu groß.<br>\n";} } else {echo "Der Dateiname enthält zu viele Zeichen.<br>\n";} } else {echo "Es scheint sich um kein JPG oder PNG zu handeln.<br>\n";} } else {echo "Es wurde noch nichts eingegen oder ausgewählt.<br>\n";} ?> </body> </html>