wake-up-neo.net

PHP move_uploaded_file () Fehler?

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?

26
Awan

Stellen Sie sicher, dass der Webserver über Berechtigungen zum Schreiben in das Verzeichnis "images /" verfügt

36

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.

37

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.

34
Martin Bean

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

16

move_uploaded_file() wird zurückkehren:

  1. FALSE wenn der Dateiname ungültig ist
  2. FALSE und issue a warning im Fehlerprotokoll, wenn der Apache-Prozess keine Lese-/Schreibberechtigungen für Quell- oder Zielverzeichnisse besitzt

PHP 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.

  1. 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.

  2. 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

  3. Schreibberechtigung am Zielverzeichnis prüfen: issue ls -ld /var/www/html/destination-directory, um zu sehen, ob der Apache-Benutzer hier Schreibrechte hat

  4. Fügen Sie die erforderlichen Berechtigungen mit chown oder chgrp hinzu.

  5. Apache neu starten mit Sudo service httpd restart

5
Ali Saeed

Ü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.

2
Piotr Müller

oder führen Sie suexec aus und müssen Sie die Berechtigungen niemals erneut ändern.

1
Jeffery Dilegge

Bitte überprüfen Sie das Berechtigungsverzeichnis "images /"

0
Hp Lam

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
0
glyph

Bitte überprüfen Sie, ob Ihr form-Tag dieses Attribut hat:

enctype="multipart/form-data"

0
dhitro

Ü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 :)

0
user2094978
$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';
    }
}