web-dev-qa-db-fra.com

Échec du téléchargement du fichier via le formulaire Web, configuration du serveur?

Je suis en train de déplacer mes sites d'un hébergement partagé vers un VPS (sous CentOS avec Plesk 10). Lors des tests sur mon VPS, j'ai remarqué que tout d'un coup, je ne pouvais plus télécharger de fichiers via un formulaire Web.

Je reçois une erreur php: Warning: move_uploaded_file(/uploads/logoklein.jpg): failed to open stream: No such file or directory in /var/www/vhosts/denkproducties.nl/httpdocs/denkproducties/upload.php on line 26 Warning: move_uploaded_file(): Unable to move '/tmp/php01nhmx' to '/uploads/logoklein.jpg' in /var/www/vhosts/denkproducties.nl/httpdocs/denkproducties/upload.php on line 26

Il y a beaucoup de questions à ce sujet sur SO, et elles impliquent presque toutes de définir correctement les autorisations. J'ai modifié à la fois le répertoire TMP et le répertoire de téléchargement au 0777 (frémissement), en vain. Je sais que 0777 n'est pas une bonne chose à faire, mais je voulais m'assurer que ce n'était pas un problème de permission pour ces dossiers.

Comme la seule chose qui a changé est le VPS, j'ai pensé que le problème devait être sur le serveur. Je pensais que le serveur Web ne fonctionnait peut-être que comme "personne" et ne pouvait donc pas accéder au dossier tmp. Iran:

ps aux | grpe httpd

Ce qui me montre:

root   27371   0.0  2.3   340860   24726  ?   SNs   12:57   0:00   /usr/sbin/httpd
Apache 27372   0.0  0.9   240994    9820 ?    SN    12:57   0:00   /usr/sbin/httpd
Apache 27373   0.0  1.6   341671   16700 ?    SN    12:57   0:00   /usr/sbin/httpd
Apache 27374   0.0  1.6   341671   16700 ?    SN    12:57   0:00   /usr/sbin/httpd
Apache 27375   0.0  1.6   341671   16700 ?    SN    12:57   0:00   /usr/sbin/httpd
Apache 27376   0.0  1.6   341671   16700 ?    SN    12:57   0:00   /usr/sbin/httpd
Apache 27377   0.0  1.6   341671   16700 ?    SN    12:57   0:00   /usr/sbin/httpd
Apache 27378   0.0  1.6   341671   16700 ?    SN    12:57   0:00   /usr/sbin/httpd
root   27817   0.0  0.0   103244     824 tty1 S+    13:40   0:00   grep httpd

Au fait, mon serveur exécute fCGI.

Par souci d'exhaustivité, j'ai créé un petit script de téléchargement avec un formulaire Web:

 $ allowed_filetypes = array ('.jpg', '.gif', '.bmp', '.png'); // Ce seront les types de fichiers qui réussiront la validation. 
 $ Max_filesize = 1024000; // Taille maximale du fichier dans BYTES (actuellement 1 Mo). 
 $ Upload_path = '/ uploads /'; // L'emplacement où les fichiers seront téléchargés (actuellement un répertoire 'uploads'). 
 
 
 $ Filename = $ _FILES ['userfile'] ['name']; // Récupère le nom du fichier (extension comprise). 
 $ Ext = sous-chaîne ($ nomfichier, strpos ($ nomfichier, '.'), Strlen ($ nomfichier) -1); // Récupère l'extension à partir du nom de fichier. 
 
 // Vérifie si le type de fichier est autorisé, sinon DIE et informe l'utilisateur. 
 If (! in_array ($ ext, $ allowed_filetypes)) 
 die ('Le fichier que vous avez tenté de télécharger n'est pas autorisé.'); 
 
 // Maintenant, vérifiez la taille du fichier, s'il est trop grand alors DIE et informez l'utilisateur. 
 if (taille du fichier ($ _FICHIERS '' fichier_utilisateur '] [' nom_mpc '])> $ taille_du_fichier) 
 Le fichier que vous avez tenté de télécharger est trop volumineux. '); 
 
 // Vérifiez si nous pouvons télécharger vers le chemin spécifié, sinon DIE et en informer l'utilisateur. ____.] //if(!is_writable($upload_path))
 // die ('Vous ne pouvez pas télécharger vers.' $ upload_path. 'le répertoire spécifié, veuillez le modifier au 777.'); 
 
 // Téléchargez le fichier dans le chemin spécifié. 
 If (move_uploaded_file ($ _ FILES ['userfile'] ['tmp_name'], $ upload_path. $ Filename)) {
 echo 'Votre téléchargement de fichier a réussi, visualisez le fichier ici'; // Cela a fonctionné. 
} Else {
 Echo 'Une erreur s'est produite lors du téléchargement du fichier. Veuillez réessayer.'; // Ça a échoué :(.
 }

Qu'est-ce que j'oublie ici?

2
Dirk de Man

Cela ressemble à une permission ou à une faute que vous connaissez déjà,

Vérifiez que /var/www/vhosts/denkproducties.nl/httpdocs/denkproductives/ le fait bien.

De plus, Apache ressemble à son fonctionnement sur le compte utilisateur Apache. Ainsi, lors de la création d'un 777 CHMOD sur le dossier que vous souhaitez enregistrer, vous pouvez constater qu'Apache est entré dans un dossier parent en raison de la premission de l'exercice.

Changez la propriété de/www/en Apache si ce n’est pas déjà fait et assurez-vous également que vous utilisez l’attribut -R pour le rendre récusif, sinon, comme je l’ai dit, un parent le bloquera.

chmod -R 777 /var/www/

Ce qui précède devrait faire l'affaire.

Si cela ne fonctionne pas et que cela ne semble pas fonctionner, vous pouvez toujours essayer dans le fichier de téléchargement.

$upload_path = '$upload_path = '/denkproducties/uploads/';
1
Simon Hayter

faites également un petit test pour vérifier si le répertoire existe avec les éléments suivants:

if( !file_exists($upload_path) ){
   exit('Directory not Found!');
}

la variable super globale $_FILES a également la taille du fichier $_FILES['userfile']['size'] pour vérifier les éléments suivants lien pour en savoir plus sur le $_FILES

1
jogesh_pi

Aucun problème, accédez simplement à votre gestionnaire de fichiers après vous être connecté à votre panneau de configuration. Ensuite, sélectionnez le dossier dans lequel vous souhaitez déplacer votre fichier. Et sélectionnez-la option d'accès juste à droite de l'icône du dossier que de sélectionner un utilisateur particulier et autoriser la lecture et l'option appropriée en cochant la case.

0
anonymous