Ich verwende den folgenden Code und lädt erfolgreich Dateien auf meinem lokalen Computer hoch. Auf meinem lokalen Rechner wird "Erfolgreich hochgeladen" angezeigt.
// Upload file
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt" );
if( $moved ) {
echo "Successfully uploaded";
} else {
echo "Not uploaded";
}
Wenn ich diesen Code jedoch auf meinem Online-Server verwendet habe, wird keine Datei hochgeladen und es wird nur die Meldung "Nicht hochgeladen" angezeigt.
Wie kann ich wissen, was das Problem ist, und wie kann ich das tatsächliche Problem für den Benutzer anzeigen lassen?
Stellen Sie sicher, dass der Webserver über Berechtigungen zum Schreiben in das Verzeichnis "images /" verfügt
Bearbeiten Sie den Code wie folgt:
// Upload file
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt" );
if( $moved ) {
echo "Successfully uploaded";
} else {
echo "Not uploaded because of error #".$_FILES["file"]["error"];
}
Sie erhalten einen der folgenden Fehlercodewerte 1 bis 8:
UPLOAD_ERR_INI_SIZE = Wert: 1; Die hochgeladene Datei überschreitet die Direktive upload_max_filesize in der php.ini.
UPLOAD_ERR_FORM_SIZE = Wert: 2; Die hochgeladene Datei überschreitet die im HTML-Formular angegebene MAX_FILE_SIZE-Direktive.
UPLOAD_ERR_PARTIAL = Wert: 3; Die hochgeladene Datei wurde nur teilweise hochgeladen.
UPLOAD_ERR_NO_FILE = Wert: 4; Es wurde keine Datei hochgeladen.
UPLOAD_ERR_NO_TMP_DIR = Wert: 6; Es fehlt ein temporärer Ordner. Eingeführt in PHP 5.0.3.
UPLOAD_ERR_CANT_WRITE = Wert: 7; Fehler beim Schreiben der Datei auf Festplatte. Eingeführt in PHP 5.1.0.
UPLOAD_ERR_EXTENSION = Wert: 8; Eine Erweiterung PHP hat den Dateiupload angehalten. PHP bietet keine Möglichkeit, festzustellen, welche Erweiterung den Dateiupload angehalten hat. Die Überprüfung der Liste der geladenen Erweiterungen mit phpinfo () kann hilfreich sein.
Versuche dies:
$upload_dir = $_SERVER['DOCUMENT_ROOT'] . "/images/";
if (is_dir($upload_dir) && is_writable($upload_dir)) {
// do upload logic here
} else {
echo 'Upload directory is not writable, or does not exist.';
}
Dadurch werden alle Dateiberechtigungsfehler sofort markiert.
Woher weiß ich das was das Problem ist
Einfach. Siehe das Fehlerprotokoll des Webservers.
wie kann ich das tatsächliche Problem für den Benutzer anzeigen lassen?
NIEMALS mach es.
Ein durchschnittlicher Benutzer wird diesen Fehler nicht verstehen.
Ein böswilliger Benutzer sollte keine Rückmeldung erhalten, insbesondere in Form einer sehr informativen Fehlermeldung.
Zeigen Sie einfach eine Seite mit Ausreden.
Wenn Sie keinen Zugriff auf das Fehlerprotokoll des Servers haben, wird Ihre Aufgabe komplizierter.
Es gibt mehrere Möglichkeiten, mit Fehlermeldungen in Kontakt zu treten.
Um Fehlermeldungen auf dem Bildschirm anzuzeigen, können Sie diese Zeilen zum Code hinzufügen
ini_set('display_errors',1);
error_reporting(E_ALL);
oder benutzerdefinierte Fehlerprotokolldatei erstellen
ini_set('log_errors',1);
ini_set('error_log','/absolute/path/tp/log_file');
und es gibt andere Wege.
Sie müssen jedoch verstehen, dass Sie sich ohne tatsächliche Fehlermeldung nicht bewegen können. Es ist schwer, im Dunkeln blind zu sein
move_uploaded_file()
wird zurückkehren:
FALSE
wenn der Dateiname ungültig istFALSE
und issue a warning
im Fehlerprotokoll, wenn der Apache-Prozess keine Lese-/Schreibberechtigungen für Quell- oder Zielverzeichnisse besitztPHP Fehlerprotokoll
Mein PHP-Fehlerprotokoll war um: /var/log/httpd/error_log
und hatte folgende Fehler:
Warnung: move_uploaded_file (images/robot.jpg): Der Stream konnte nicht geöffnet werden: Die Berechtigung wurde in /var/www/html/mysite/mohealth.php in Zeile 78 verweigert
Warnung: move_uploaded_file (): '/ tmp/phpsKD2Qm' kann nicht in 'images/robot.jpg' in /var/www/html/mysite/mohealth.php in Zeile 78 verschoben werden
move_uploaded_file()
versucht, Dateien aus einem temporären Verzeichnis in ein Zielverzeichnis zu verschieben. Wenn der Apache-Prozess versuchte, Dateien zu verschieben, konnte er das temporäre Verzeichnis nicht lesen oder in das Zielverzeichnis schreiben.
Finden Sie heraus, welcher Benutzer Apache (Web Server) ausführt Prüfen Sie anhand des Befehls, welcher Benutzer den Apache-Dienst ausführt: ps aux | grep httpd
. Die erste Spalte enthält den Benutzernamen.
Leseerlaubnis im temporären Verzeichnis prüfen: Sie können den Pfad zu Ihrem temporären Verzeichnis finden, indem Sie echo sys_get_tmp_dir();
in einer PHP-Seite aufrufen. Geben Sie dann in der Befehlszeile ls -ld /tmp/temporary-dir
aus, um zu sehen, ob der Apache-Benutzer hier Lesezugriff hat
Schreibberechtigung am Zielverzeichnis prüfen: issue ls -ld /var/www/html/destination-directory
, um zu sehen, ob der Apache-Benutzer hier Schreibrechte hat
Fügen Sie die erforderlichen Berechtigungen mit chown
oder chgrp
hinzu.
Apache neu starten mit Sudo service httpd restart
Überprüfen Sie, ob die Datei in Ordnung ist. Möglicherweise haben Sie max_post_size oder max_upload_filesize überschritten. Wenn Sie sich mit FileZilla anmelden, kopieren Sie Dateien wie Sie. Wenn Sie diese Datei mit PHP hochladen, wird die Datei von einem Benutzer ausgeführt, der Apache ausführt (für exaplme www-data). Versuchen Sie, chmod 755 für Bilder anzugeben.
oder führen Sie suexec aus und müssen Sie die Berechtigungen niemals erneut ändern.
Bitte überprüfen Sie das Berechtigungsverzeichnis "images /"
Ich bin auf eine sehr undurchsichtige und ärgerliche Fehlerursache 6 gestoßen. Nachdem ich mit einigen von NFS gemounteten Volumes herumgepfuscht hatte, schlugen die Uploads fehl. Problem durch Neustart der Dienste behoben
systemctl restart php-fpm.service
systemctl restart httpd.service
Bitte überprüfen Sie, ob Ihr form
-Tag dieses Attribut hat:
enctype="multipart/form-data"
Überprüfen Sie beim virtuellen Hosting Ihren disk quota
.
wenn das Kontingent überschritten wird, wird move_uploaded_file
zurückgegeben.
PS: Ich habe schon lange danach gesucht :)
$uploadfile = $_SERVER['DOCUMENT_ROOT'].'/Thesis/images/';
$profic = uniqid(Rand()).$_FILES["pic"]["name"];
if(is_uploaded_file($_FILES["pic"]["tmp_name"]))
{
$moved = move_uploaded_file($_FILES["pic"]["tmp_name"], $uploadfile.$profic);
if($moved)
{
echo "sucess";
}
else
{
echo 'failed';
}
}