PHP 4.3

11.2.5 Überschreiben von Dateien beim Upload

Unter Umständen möchten Sie vor dem Speichern einer Datei prüfen, ob eine gleichnamige Datei überschrieben werden könnte. Dieser Umstand kann insbesondere dann eintreten, wenn die Besucher Ihrer Website die Namen der Dateien selbst festlegen können.

PHP stellt die Funktion file_exists() zur Verfügung, die entweder den booleschen Wert false (Datei ist nicht vorhanden) oder true (Datei ist vorhanden) zurückliefert. Wir möchten Ihnen darüber hinaus an dieser Stelle zwei Funktionen vorstellen, mit deren Hilfe Sie die bereits vorhandenen Dateien löschen oder verschieben/umbenennen können.

unlink(Datei); Löschen einer Datei. Dabei kann ein relativer oder absoluter Pfad angegeben werden.
rename(Quellname, Zielname); Umbenennen oder Verschieben einer Datei unter Angabe des Quellnamens (und einer optionalen vorangestellten Pfadangabe) sowie des Zielnamens (und optionaler vorangestellter Pfadangabe)

Mit diesen beiden Funktionen und der Funktion file_exists() sind Sie in der Lage, ein Skript zu entwickeln, das vor dem Schreiben einer Datei prüft, ob eine Datei mit der vom Benutzer gewünschten Bezeichnung bereits besteht, und diese gegebenenfalls umbenennt, verschiebt oder löscht.

Das Szenario des nachfolgenden Skripts behandelt eine einfache "Backup-Lösung". Wir möchten erreichen, dass Dateien, bevor sie überschrieben werden, mit dem Präfix "old_" gesichert werden, damit wir bei Bedarf die alte Datei reaktiveren können. Sollte bereits ein Backup vorliegen, wird es durch die neuere Datei ersetzt. Anschließend soll die hochgeladene Datei mit dem vom Benutzer gewünschten Namen abgelegt werden.

Hinweis: Das Beispiel verdeutlicht den Einsatz beider Funktionen. Im praktischen Einsatz wäre für dieses Skript kein unlink() notwendig, da rename() ohnehin bestehende Dateien überschreibt.

Beispielskript Umbenennen und Löschen von Dateien
 
   <?php

        $datei_pfad = $HTTP_POST_VARS["zielpfad"] . "/" . $HTTP_POST_VARS["zielname"];
*1      if (file_exists($datei_pfad)) {
*2        if (file_exists($HTTP_POST_VARS["zielpfad"] . "/old_" . $HTTP_POST_VARS["zielname"])) {
*3           unlink($HTTP_POST_VARS["zielpfad"] . "/old_" . $HTTP_POST_VARS["zielname"]);
          }
*4        rename($datei_pfad, $HTTP_POST_VARS["zielpfad"] . "/old_" . $HTTP_POST_VARS["zielname"]);
        }
        $datei_in = @fopen($HTTP_POST_FILES["userfile"]["tmp_name"], "r");
        $datei_out = @fopen($datei_pfad, "w");
        $datei_temp = fread($datei_in, $HTTP_POST_FILES["userfile"]["size"]);
        fwrite($datei_out, $datei_temp, $HTTP_POST_FILES["userfile"]["size"]);
        fclose($datei_in);
        fclose($datei_out);

    ?>

Das Quellformular für dieses Skript ist das gleiche, das am Anfang des Absatzes zum Upload von Dateien verwendet wird. Die erste Zeile des vorliegenden Skripts kennen Sie bereits. Wir setzen dort den Pfad und Dateinamen der hochgeladenen Datei zusammen. Als nächstes wird geprüft, ob unter dem zusammengesetzten Namen bereits eine Datei existiert (*1). Ist dies der Fall, wird weiterhin geprüft, ob bereits schon einmal eine Umbenennung (dem Dateinamen wurde dafür der String "old_" vorangesetzt) stattgefunden hat (*2). Ist auch dies der Fall, wird das alte nun nicht mehr notwendige "Backup" gelöscht (*3) und die Datei, die bereits vorliegt und nicht überschrieben werden soll, zum aktuellen Backup umgewandelt (*4). Nun kann die hochgeladene Datei in der Ihnen bereits bekannten Art und Weise abgelegt werden.

Kommentare (0)

Ihr Kommentar

Name