Home
Navigation
Impressum
Coder Welten - Programmierung und Optimierung
Coder Welten
 
 

 

 

CSV: Ein kleines Upload-Script für Bilder

Beschreibung eines einfachen Upload-Scripts

Übersicht » Einführung CSV

Tutorial mit Beispielen für eine Bildergalerie:

  1. Kleines Upload-Script (ein einfaches PHP-Upload-Script für Images)
  2. Kleines Galerie-Script (Bespiel für ein einfaches PHP-Galerie-Script)
  3. Demo kleine Galerie (Demo einer kleinen Bildergalerie)
  4. Erweitertes Upload-Script (Erzeugung von Vorschaubildern inklusive)
  5. Thumbnails Klasse (eine Klasse für die Erzeugung von Thumbnails)
  6. Erweitertes Galerie-Script (Bespiel für ein erweitertes PHP-Galerie-Script)
  7. Demo erweiterte Galerie (Demo einer erweiterten Bildergalerie)

Einsatz und Verwendung

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.

Einzelheiten und Beschreibung

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>

Copyright © Verlag Horst Müller - Stendal - 2006 - Impressum - Datenschutz - Nutzungsbedingungen