Frage von Minding, 2

PHP unlink Datei wird nur nicht angezeigt

Hallo Community,

ich habe eine PHP-datei, welche ein Bild ändert (löscht und ersetzt), jedoch löscht unlink das Bild nicht immer (deshalb der diskrete Name). In meinem Fall wird das Bild (von Windows 7) nicht mehr angezeigt, jedoch ist es auf der Seite (mit xampp) noch zu sehen. move_uploaded_file liefert FALSE zurück.

Hier ein Kommentar in der PHP-Dokumention dazu: http://php.net/manual/de/function.unlink.php#101637

PHP:

if(isset($_POST['image'])) {
        $imagePath = '../include/images/profileImages/'.$ID.'.png';
        //Overwrite
        if(file_exists($imagePath)) {
            //1. Change the file permissions if allowed
            //2. Remove the file
            if(!chmod($imagePath, 0755) OR !unlink($imagePath)) {
                $_SESSION['error'] = $language['profileErrorOverwriteImage'];
                header('Location:' . $_SERVER['HTTP_REFERER']);
                echo "<script>window.history.back()</script>";
                die($language['profileErrorOverwriteImage']);
            }
        }
        if(!move_uploaded_file($_FILES['image']['tmp_name'], $imagePath)) {
            $_SESSION['error'] = $language['profileErrorCanNotSaveImage'];
            header('Location:' . $_SERVER['HTTP_REFERER']);
            echo "<script>window.history.back()</script>";
            die($language['profileErrorCanNotSaveImage']);
        }
        unset($_POST['image']);
    }

HTML: (Bild anzeige)

<form class="profile" method="POST" action="profile/update.php">
            <img src="include/images/profileImages/<?php echo $user['ID']; ?>.png">
            <label class="upload"><p><?php echo $language['profileChangeImage']; ?></p><input name="image" type="file" maxlength="1000000" accept="image/*" /></label>
            <h3><?php echo $user['name']; ?></h3>
            <?php echo $language['addBirthday']; ?><input type="text" name="birthday" value="<?php echo $user['birthday']; ?>" /><br /><br />
            <?php echo $language['addEmail']; ?><input type="text" name="email" value="<?php echo $user['email']; ?>" /><br /><br />
            <input type="submit" value="<?php echo $language['profileSave']; ?>" />
        </form>

Fragen:

  • Wie kann ich das Bild endgültig löschen?
  • Wieso wird das Bild nicht komplett gelöscht?

PS: Für alle die gerne Rätsel lösen - ich hab noch nen paar ungelöste Fragen.

Danke, schon mal im Voraus!

-Minding

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von FaronWeissAlles, 2
Wie kann ich das Bild endgültig löschen?

Du bist schon am richtigen Weg, unlink() ist die Funktion die das bewerkstelligt und die musst du auch benutzen um die Datei zu löschen.

Wieso wird das Bild nicht komplett gelöscht?

Das kann ich dir nicht genau sagen. Der Kommentar bzw. die Dokumentation der Funktion gibt ja Hinweise darauf wann es nicht funktioniert (Datei nicht vorhanden, keine Berechtigungen, es gibt einen weiteren Link zur Datei oder gerade von anderem Prozess geöffnet). Daraufhin solltest du auch die Situation untersuchen und eine der genannten Ursachen nach der anderen ausschließen (also schauen ob der Pfad stimmt, ob du Schreibberechtigungen hast und die Datei nicht gerade geöffnet ist, etc).

Des Weiteren solltest du immer im Hinterkopf behalten, dass der Browser Mediendateien (vor allem Bilder) zwischenspeichert. Den Verlauf löscht, oder noch besser:

<head>
    ...
    <meta http-equiv="cache-control" content="no-cache">
    ...
</head>

in jede Ausgabeseite einfügen sollte den Browser anweisen dass er immer die Daten neu vom Server ziehen soll. Zumindest während der Entwicklung. Das kann einem zahlreiche Kopfschmerztabletten ersparen.

error_reporting(E_ALL); 

Ist auch noch empfehlenswert während der Entwicklung zu setzen um vom PHP-Server wegen jedem Mist angemeckert zu werden. Dann bekommt man schneller mit, wenns irgendwo schiefgeht (z.B. weil man eine Variable benutzt die man nie zugewiesen hat)

Kommentar von Minding ,

Hi,

ich hab mir den Fehler jetzt mit Hilfe einer Log-Datei anzeigen lassen und zwar ist $_FILES['image'] nicht definiert.

Wieso?

$_FILES['image']['error'] ist leer.

-Minding

Kommentar von Minding ,

Hi,

ich könnte heulen, zwei Tage nix gemacht nur wegen einem simplen:

enctype="multipart/form-data"

Für alle die auch ein leeres $_FILES array haben: http://stackoverflow.com/questions/3586919/why-would-files-be-empty-when-uploadi...

-Minding

Kommentar von FaronWeissAlles ,

Das kenn ich. Man sitzt ewig vor einem Problem, das eine total simple Lösung hat, aber kommt einfach nicht drauf. Man hätte so viel machen können, würde einem dieser Stein nicht im Weg liegen.

In solchen Situationen ist es sinnvoll einen 2. Entwickler drüber schauen zu lassen, da er nicht betriebsblind ist. Oder, falls man keinen Kollegen an der Hand hat, vom Problem Abstand nehmen, was anderes machen und sich nach einiger Zeit wieder mit dem Problem beschäftigen. Deswegen hab ich immer 1-2 weniger wichtige Projekte am laufen.

Aber auch wenn man so seine Zeit nicht komplett verschwendet, bleibt es extrem ärgerlich. Aber sehs mal so: Dieser Fehler bleibt dir in Erinnerung und wirst du sicher nicht so schnell erneut machen. Wann immer jetzt dein Files-Array leer bleibt denkst du sofort an den enctype und checkst das

Antwort
von Minding, 2

EDIT:

Das Bild war nur in meiner Cache.

Nun wird das Bild gar nicht mehr angezeigt.

Ich kann auch immer noch keins Speichern.

-Minding

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten