2010-08-17 6 views
23

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. Mais quand j'ai utilisé ce code sur mon serveur en ligne, il ne télécharge pas de fichier et affiche simplement le message "Non téléchargé".Erreur PHP move_uploaded_file()?

Comment puis-je savoir quel est le problème et comment puis-je faire afficher le problème réel à l'utilisateur?

+1

Avez-vous le dossier images sur le serveur Web? Est-ce que le dossier est en lecture seule ou pouvez-vous écrire? – gabe3886

+0

Un message d'erreur généré PHP? BTW vous n'avez pas besoin d'utiliser $ déplacé, vous pouvez mettre la commande move_uploaded_file dans l'instruction. – fabrik

+0

@all: C'est le problème qu'il ne montre aucune erreur/avertissement sur le serveur. Le dossier Images existe et je peux télécharger des fichiers dans ce dossier en utilisant FileZilla. – Awan

Répondre

33

Vérifiez que le serveur Web dispose des autorisations d'écrire sur le « images/» Répertoire

+0

Je peux télécharger des fichiers dans ce dossier manuellement en utilisant FileZilla, cela signifie qu'il a les droits. Toute autre possibilité? – Awan

+10

FileZilla ne prouve pas que le serveur web a des permissions. Le serveur Web fonctionnera probablement sous un utilisateur différent de vous. Pour vous assurer qu'il dispose des autorisations, définissez les autorisations sur 777, puis testez. Cela devrait prouver si c'est un problème d'autorisation ou autre chose. –

+0

chown -R 777 yourdirectory –

2

-vous vérifie que le fichier est téléchargé ok? Peut-être avez-vous dépassé max_post_size, ou max_upload_filesize. Lorsque vous vous connectez en utilisant FileZilla vous copiez des fichiers comme vous, lors du téléchargement par PHP wiritng ce fichier provient d'un utilisateur qui exécute apache (pour exaplme www-data), essayez de mettre chmod 755 pour les images.

16

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

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

Comment afficher le problème réel à l'utilisateur?

NE JAMAIS le faire.
Un utilisateur moyen ne comprendra rien de cette erreur.
Un utilisateur malveillant ne devrait recevoir aucun retour, en particulier sous la forme d'un message d'erreur très instructif.

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 d'entrer en contact avec les messages d'erreur.

Pour afficher les messages d'erreur sur l'écran, vous pouvez ajouter ces lignes au code

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

ou pour faire logfile d'erreur personnalisée

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

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

+0

Eh bien, c'est bien de montrer des erreurs sur un site de développement. Il n'est pas toujours possible de rediriger les erreurs vers un fichier journal (par exemple, sur un hébergement partagé). –

+0

@Pekka nous parlons d'un live atm. Et, honnêtement, un tel hébergement devrait être abandonné immédiatement. –

30

noir Essayez ceci:

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

Ce signaleront instantanément toute erreur d'autorisation de fichier.

+0

Aucun d'entre eux. Et une telle gestion des erreurs est inutile. –

+12

Attention à élaborer pour ceux qui ne sont pas informés? –

+1

Dit que «le répertoire de téléchargement n'est pas accessible en écriture ou n'existe pas». Comment cela est résolu, s'il vous plaît expliquer? –

1

ou exécutez suexec et ne plus jamais modifier les autorisations.

5

move_uploaded_file() renverra:

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

PHP Error Log

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

Attention: move_uploaded_file (images/robot.jpg): failed to open stream: Permission denied dans/var/www/html/monsite/mohealth. php sur la ligne 78

Attention: move_uploaded_file(): impossible à déplacer '/ tmp/phpsKD2Qm' à 'images/robot.jpg' dans /var/www/html/mysite/mohealth.php sur la ligne 78

move_uploaded_file() essaie de déplacer des 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 ou écrire dans le répertoire de destination.

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

  2. Vérifiez la permission de lecture à temporaire Dir: Votre peut trouver le chemin de votre répertoire temp en appelant echo sys_get_tmp_dir(); dans une page php. Ensuite, sur la ligne de commande, question ls -ld /tmp/temporary-dir pour voir si l'utilisateur apache a accès à lire ici

  3. Vérifiez la permission d'écriture à destination Dir: question ls -ld /var/www/html/destination-directory pour voir si l'utilisateur apache a accès à écrire ici

  4. Ajouter des autorisations au besoin à l'aide chown ou chgrp

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

+0

Comment vérifier l'utilisateur dans Windows? – Black

+1

Le problème a été résolu avec le mot clé "source". Regardez cela: "move_uploaded_file() retournera FALSE et émettra un avertissement dans le journal des erreurs si le processus apache n'a pas d'autorisations de lecture/écriture sur les répertoires 'source' ou destination." Il ne suffit donc pas de donner toutes les permissions à votre répertoire de projet et de donner toutes les permissions à l'emplacement du fichier source. – Hasan

22

Modifier le code à la manière suivante:

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

Il vous donnera un des codes d'erreur suivant les valeurs 1 à 8:

UPLOAD_ERR_INI_SIZE = Valeur: 1; Le fichier téléchargé dépasse la directive upload_max_filesize dans 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 en PHP 5.0.3.

UPLOAD_ERR_CANT_WRITE = Valeur: 7; Impossible d'écrire le fichier sur le disque. Introduit en PHP 5.1.0.

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

0

S'il vous plaît vérifier que votre balise form ont cet attribut:

enctype="multipart/form-data"

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

sur l'hébergement virtuel vérifier votre disk quota.

si le quota dépasse, move_uploaded_file erreur de retour.

PS: Cela fait longtemps que je la recherche :)