Beschreibung des Problems:
Heute ist bei der Implementierung eines PHP-Skripts, das bei der Benutzerregistrierung Avatar-Bilddateien hochlädt, ein Problem aufgetreten: Das PHP-Skript wurde zuvor ermittelt
Es gibt keinen Fehler beim Hochladen von Dateien auf der Browserseite.
Die hochgeladene Datei ist legal.
Die hochgeladene Datei ist eine Bilddatei.
Auf der Serverseite wurden eindeutige Dateinamen generiert.
Code
Als nächstes sollten wir die Datei vom temporären Speicherort an den festen Speicherort verschieben, also habe ich das folgende Skript geschrieben:
//Verschieben Sie die Datei vom temporären Speicherort zum festen Speicherort @move_uploaded_file($_FILES[$image_fieldname]['tmp_name'], $upload_filename) or handle_error("Fehler beim Speichern der Bilddatei", "Fehler beim Verschieben der Datei " . "{ $upload_filename}");
Die Codefunktion handle_error() ist meine eigene definierte Fehlerbehandlungsfunktion. Wenn die Funktion move_uploaded_file einen Fehler macht, springt sie zur Fehlerseite. Wenn ich das obige Skript ausführe, Das Skript springt Als ich auf die Fehlerseite kam, war es offensichtlich, dass etwas nicht stimmte. Zuerst habe ich überprüft, ob ein Fehler in meinen Funktionsparametern vorlag:
$_FILES[$image_fieldname]['tmp_name']$upload_filename //Dies ist meine eigene Kombination von Dateipfaden, garantiert korrekt
Laut PHP-Handbuch sind dies die beiden oben genannten Parameter, die ich an die Funktion übergeben habe Ist garantiert korrekt. Das Problem ist, was ist los? Auf der Seite wird kein Fehler gemeldet (ich habe den „@“-Operator von PHP vor der Funktion verwendet, sodass die Seite keinen Fehler meldet)
@operator
Hinweis: Seien Sie vorsichtig, wenn Sie den @-Operator in Ihrem Code verwenden.
Der @-Operator kann alle Probleme ausschließen, die auf ungültige Benutzereingaben zurückzuführen sind oder die SQL-Abfrage eine falsche Spalte oder sogar einen unregelmäßigen URL-Fehler enthält kann vermieden werden, und der Code prüft möglicherweise nicht einmal auf Fehler, die vom Benutzer, selbst oder vom Band generiert wurden. Kurz gesagt, der @-Operator kann Fehlermeldungen aus dem Code maskieren, weil sie einfach nicht abstürzen können stoppen Sie, aber verwenden Sie in diesem Fall andere Methoden zur Fehlerbehebung.
Suche nach der Fehlerprotokolldatei
Damals wusste ich nicht, dass der @-Operator die Fehlermeldung blockiert, also wollte ich nach der Fehlerprotokolldatei von Apache suchen, weil ich sie beim Einrichten verwendet habe Die PHP-Entwicklungsumgebung ist ein Entwicklungskit wie xampp, daher unterscheidet sich die Datei error_log von dem, was in den meisten Artikeln im Internet steht. Am Ende habe ich
(mein Host ist Ubuntu)
/opt/lampp/logs
gefunden. Natürlich ist auch die error_log-Datei von Apache in diesem Pfad gespeichert, ich habe das Fehlerproblem gesehen: unzureichende Berechtigungen. Endlich habe ich den Fehler gefunden: Das Zielverzeichnis, in dem wir Bilder speichern, hat keine Berechtigungen für den Benutzer, der das PHP-Skript ausführt, ist nicht derselbe Benutzer, der den Skriptcode geschrieben und den Bildordner erstellt hat >
Ändern Sie die Berechtigungen des Zielordners
Egal was passiert, wir haben immer noch die Ursache des Problems gefunden, was sehr erfreulich ist, da der Benutzer und die Berechtigungen des Ordners falsch sind, müssen wir nur ändern diese Probleme. :
Ändern Sie die Berechtigungen des Ordners auf 755
Wer ist also der Benutzer, der Apache ausführt? Wir verwenden ein PHP-Skript, um Folgendes zu erhalten:
Auf diese Weise habe ich den Benutzer erhalten, der das Skript ausgeführt hat: Daemon get ist wahrscheinlich das gleiche wie bei mir, aber anders.
Ändern wir den Benutzer, dem der Ordner gehört:
~/web/hello_php/uploads ist der Zielpfad, in dem ich die Bilder speichere. -R bedeutet, den Benutzer des Ordners in diesem Verzeichnis rekursiv zu ändern.
chmod 775 -R ~/web/hello_php/uploads
Und wir sind fertig,
Referenzlektüre: http://www.manongjc.com/article/1494.html