web-dev-qa-db-fra.com

PHP erreur move_uploaded_file ()?

J'utilise le code suivant et il télécharge avec succès des fichiers sur ma machine locale. Il montre "Téléchargé avec succès" sur ma machine locale.

// Upload file
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt" );

if( $moved ) {
  echo "Successfully uploaded";         
} else {
  echo "Not uploaded";
}

Mais lorsque j'ai utilisé ce code sur mon serveur en ligne, il ne télécharge pas de fichier et affiche uniquement le message "Non téléchargé".

Comment puis-je savoir quel est le problème et comment puis-je afficher le problème à l’utilisateur?

26
Awan

Vérifiez que le serveur Web dispose des autorisations nécessaires pour écrire dans le répertoire "images /"

36

Modifiez le code comme suit:

// 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"];
}

Cela vous donnera l'une des valeurs de code d'erreur suivantes de 1 à 8:

UPLOAD_ERR_INI_SIZE = Valeur: 1; Le fichier téléchargé dépasse la directive upload_max_filesize dans le fichier php.ini.

UPLOAD_ERR_FORM_SIZE = Valeur: 2; Le fichier téléchargé dépasse la directive MAX_FILE_SIZE spécifiée dans le formulaire HTML.

UPLOAD_ERR_PARTIAL = Valeur: 3; Le fichier téléchargé n'a été que partiellement téléchargé.

UPLOAD_ERR_NO_FILE = Valeur: 4; Aucun fichier n'a été téléchargé.

UPLOAD_ERR_NO_TMP_DIR = Valeur: 6; Absence d'un dossier temporaire. Introduit dans PHP 5.0.3.

UPLOAD_ERR_CANT_WRITE = Valeur: 7; Échec de l'écriture du fichier sur le disque. Introduit dans PHP 5.1.0.

UPLOAD_ERR_EXTENSION = Valeur: 8; Une extension PHP a arrêté le téléchargement du fichier. PHP ne permet pas de déterminer quelle extension a provoqué l'arrêt du téléchargement du fichier; examiner la liste des extensions chargées avec phpinfo () peut aider.

37
Denver Chiwakira

Essaye ça:

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

Cela signalera instantanément toutes les erreurs d'autorisation de fichier.

34
Martin Bean

Comment puis-je savoir que quel est le problème

Facile. Reportez-vous au journal des erreurs du serveur Web.

comment puis-je obtenir le problème réel à afficher à l'utilisateur?

JAMAISfais-le.
Un utilisateur moyen ne comprendra rien de cette erreur.
Un utilisateur malveillant ne devrait recevoir aucun retour, en particulier sous forme de message d'erreur très informatif.

Il suffit de montrer une page avec des excuses. 

Si vous n'avez pas accès au journal des erreurs du serveur, votre tâche devient plus compliquée.
Il existe plusieurs façons de contacter les messages d'erreur. 

Pour afficher des messages d'erreur à l'écran, vous pouvez ajouter ces lignes au code.

ini_set('display_errors',1);
error_reporting(E_ALL);

ou pour créer un fichier journal d'erreur personnalisé

ini_set('log_errors',1);
ini_set('error_log','/absolute/path/tp/log_file');

et il y a d'autres moyens.
mais vous devez comprendre que sans message d'erreur, vous ne pouvez pas vous déplacer. Il est difficile d'être aveugle dans le noir

16
Your Common Sense

move_uploaded_file() retournera:

  1. FALSE si le nom du fichier est invalide
  2. FALSE et issue a warning dans le journal des erreurs si le processus Apache ne dispose pas d'autorisations de lecture/écriture sur les répertoires source ou de destination

PHP Journal des erreurs

Mon journal des erreurs php était à: /var/log/httpd/error_log et avait ces erreurs:

Avertissement: move_uploaded_file (images/robot.jpg): échec de l'ouverture du flux: autorisation refusée dans /var/www/html/mysite/mohealth.php à la ligne 78

Avertissement: move_uploaded_file (): impossible de déplacer "/ tmp/phpsKD2Qm" vers "images/robot.jpg" dans /var/www/html/mysite/mohealth.php à la ligne 78

move_uploaded_file() tente de déplacer les fichiers d'un répertoire temporaire vers un répertoire de destination. Lorsque le processus Apache a essayé de déplacer des fichiers, il n'a pas pu lire le fichier temporaire ni écrire dans le répertoire de destination.

  1. Recherchez quel utilisateur exécute Apache (serveur Web) Vérifiez quel utilisateur exécute le service Apache avec cette commande: ps aux | grep httpd. La première colonne est le nom d'utilisateur.

  2. Vérifiez les autorisations de lecture dans le répertoire temporaire: Vous pouvez trouver le chemin de votre répertoire temporaire en appelant echo sys_get_tmp_dir(); dans une page php. Ensuite, sur la ligne de commande, lancez ls -ld /tmp/temporary-dir pour voir si l'utilisateur Apache a le droit de lire ici.

  3. Vérifiez les autorisations en écriture dans le répertoire de destination: issue ls -ld /var/www/html/destination-directory pour voir si l'utilisateur Apache a le droit d'écrire ici

  4. Ajoutez les autorisations nécessaires à l'aide de chown ou chgrp

  5. Redémarrez Apache en utilisant Sudo service httpd restart

5
Ali Saeed

Est-ce que vous vérifiez que le fichier est bien téléchargé? Peut-être avez-vous dépassé max_post_size ou max_upload_filesize. Lorsque vous vous connectez à l'aide de FileZilla, vous copiez des fichiers de la même manière que, lors du téléchargement via PHP, ce fichier provient d'un utilisateur qui exécute Apache (par exemple, www-data). Essayez de mettre chmod 755 pour les images.

2
Piotr Müller

ou exécutez suexec sans jamais avoir à modifier les autorisations.

1
Jeffery Dilegge

S'il vous plaît vérifier la permission "images /" répertoire

0
Hp Lam

Vérifiez que votre balise form a cet attribut:

enctype="multipart/form-data"

0
dhitro

Sur l'hébergement virtuel, vérifiez votre disk quota.

si le quota est dépassé, move_uploaded_file renvoie une erreur.

PS: Je cherche ça depuis longtemps :)

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