Heim  >  Artikel  >  php教程  >  Lösung des Problems, dass die PHP-Funktion move_uploaded_file Bilder nicht verschieben konnte

Lösung des Problems, dass die PHP-Funktion move_uploaded_file Bilder nicht verschieben konnte

WBOY
WBOYOriginal
2016-09-30 09:23:091465Durchsuche

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)

gefunden Die php_error_log-Datei wurde im Pfad

/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 >

Tatsächlich müssen wir nicht so mühsam sein. Wir müssen nur den @-Operator vor der Funktion entfernen und dann die Fehlerbehandlungsfunktion handle_error() entfernen, und dann können wir die Fehlermeldung sehen auf der Webseite.

Ä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 den Benutzer, dem der Ordner gehört, in dem die Bilder gespeichert sind, und ändern Sie ihn in den Benutzer, der Apache ausführt und PHP-Skripte ausführt.

Ä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:

echo exec('whoami'); //Den Benutzernamen zum Ausführen der Datei abrufen und dadurch die Berechtigungen des Bildordners ändern

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:

chown daemon -R ~/web/hello_php/uploads

~/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.

Ändern Sie dann die Ordnerberechtigungen

chmod 775 -R ~/web/hello_php/uploads

Und wir sind fertig,

Referenzlektüre: http://www.manongjc.com/article/1494.html

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn