web-dev-qa-db-fra.com

move_uploaded_file génère l'erreur "Impossible d'ouvrir le flux: autorisation refusée" après toutes les configurations que j'ai effectuées.

Je continue à avoir cette erreur en essayant de configurer le répertoire de téléchargement avec Apache 2.2 et PHP 5.3 sur CentOS.

Dans php.ini:

upload_tmp_dir = /var/www/html/mysite/tmp_file_upload/

Dans httpd.conf:

Directory /var/www/html/mysite/tmp_file_upload/>
    Options  -Indexes
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
<Directory /var/www/html/mysite/images/>
                Options -Indexes
</Directory>

Autorisations de répertoire CentOS:

drwxrwxr-x 2 root root 4096 Nov 11 10:01 images
drwxr-xr-x 2 root root 4096 Nov 12 04:54 tmp_file_upload

Quoi que je fasse, je reçois toujours cette erreur de PHP lorsque je télécharge le fichier:

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

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

Comme vous pouvez le constater, la configuration du fichier php.ini n’a jamais été prise en ce qui concerne le fichier de téléchargement.

Qu'est-ce que je fais mal ici?

133
user63898

En effet, images et tmp_file_upload ne sont accessibles en écriture que par l'utilisateur root. Pour que le téléchargement fonctionne, nous devons rendre le propriétaire de ces dossiers identique à celui du propriétaire du processus httpd OR afin de les rendre globalement accessibles en écriture (mauvaise pratique).

  1. Vérifiez le propriétaire du processus Apache: $ps aux | grep httpd. La première colonne sera le propriétaire, généralement nobody
  2. Modifiez le propriétaire de images et tmp_file_upload pour qu'il devienne nobody ou le propriétaire que vous avez trouvé à l'étape 1.

    $Sudo chown nobody /var/www/html/mysite/images/
    
    $Sudo chown nobody /var/www/html/mysite/tmp_file_upload/
    
  3. Chmod images et tmp_file_upload maintenant accessible en écriture par le propriétaire, si nécessaire [Il semble que vous l'avez déjà en place]. Mentionné dans la réponse de @Dmitry Teplyakov.

    $ Sudo chmod -R 0755 /var/www/html/mysite/images/
    
    $ Sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/
    
  4. Pour plus de détails sur les causes de ce problème, consultez le manuel http://php.net/manual/fr/ini.core.php#ini.upload-tmp-dir , notez qu'il est également question de open_basedir directive.

174
Laith Shadeed

Vous pouvez également exécuter ce script pour connaître le propriétaire du processus Apache:

<?php echo exec('whoami'); ?>

Et changez ensuite le propriétaire du répertoire de destination en ce que vous avez. Utilisez la commande:

chown user destination_dir

Et puis utilisez la commande

chmod 755 destination_dir

pour changer l'autorisation du répertoire de destination.

69
twlkyao

Si vous avez Mac OS X, allez à la racine du fichier ou au dossier de votre site web.

Ensuite, cliquez dessus avec le bouton droit de la souris, allez chercher des informations, allez tout en bas (partage & autorisations), ouvrez-le, changez tout en lecture seule pour lire et écrire. Assurez-vous d’ouvrir le cadenas, aller sur l’icône de réglage et choisir Appliquer pour les éléments inclus ...

16
hawkar ITstudent

Modifier les autorisations pour ce dossier

# chmod -R 0755 /var/www/html/mysite/images/

11
Dmitry Teplyakov

Je voulais ajouter ceci aux suggestions précédentes. Si vous utilisez une version de Linux sur laquelle SELinux est activé, vous devez également l'exécuter dans un shell:

chcon -R --type httpd_sys_rw_content_t /path/to/your/directory

En plus d'accorder des autorisations utilisateur à votre serveur Web, soit par le biais d'un groupe, soit en changeant le propriétaire du répertoire.

10
Chris

Cela a fonctionné pour moi.

Sudo adduser <username> www-data
Sudo chown -R www-data:www-data /var/www
Sudo chmod -R g+rwX /var/www

Puis déconnectez-vous ou redémarrez.

Si SELinux se plaint, essayez ce qui suit.

Sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www(/.*)?'
Sudo restorecon -Rv '/var/www(/.*)?'
8
Junius L.

Je me suis heurté à ce problème, même après avoir déjà exécuté avec succès compositeur. J'ai mis à jour le compositeur et lors de l'exécution de composer install ou php composer.phar install j'ai eu:

... Impossible d'ouvrir le flux: autorisation refusée ...

Après de nombreuses recherches, il s'avère que les réponses précédentes concernant la modification des autorisations pour le dossier fonctionnaient. Ce ne sont que des répertoires légèrement différents maintenant.

Dans mon installation, sous OS X, le fichier de cache est dans /Users/[USER]/.composer/cache et j'ai eu des problèmes parce que le fichier de cache appartenait à root. Changer le propriétaire de '.composer' de manière récursive pour mon utilisateur a résolu le problème.

C'est ce que j'ai fait:

Sudo chown -R [USER] cache

Ensuite, j'ai exécuté à nouveau le composer et le tour est joué!

7
abaumer

Essaye ça:

  1. ouvrir/etc/Apache2/envvars

    Sudo gedit /etc/Apache2/envvars
    
  2. remplacez www-data par votre your_username

    "export Apache_RUN_USER=www-data" 
    

    remplacer par

    export Apache_RUN_USER='your_username' 
    
6
redrider

Ce problème se produit lorsque l'utilisateur Apache (www-data) n'a pas l'autorisation d'écrire dans le dossier. Pour résoudre ce problème, vous devez placer l'utilisateur dans le groupe www-data.

Je viens de faire ceci:

Exécutez ce code php <?php echo exec('whoami'); ?> pour découvrir l'utilisateur utilisé par Apache. Ensuite, exécutez les commandes dans le terminal:

user@machine:/# cd /var/www/html

user@machine:/var/www/html# ls -l

Il va retourner quelque chose comme ça:

total of files

drwxr-xr-x 7 user group size date folder

J'ai gardé l'utilisateur mais changé le groupe en www-data

chown -R user:www-data yourprojectfoldername

chmod 775 yourprojectfoldername
5
Jefferson Romano

Il suffit de changer l'autorisation de tmp_file_upload à 755 Voici la commande chmod -R 755 tmp_file_upload

3
Sarang

La solution est si simple. Cliquez avec le bouton droit de la souris sur le dossier IMAGE (destination), accédez à Propriétés, cliquez sur l'onglet Droits et modifiez l'accès des autres en Créer et supprimer des fichiers.

2
Basim

Essaye ça

find /var/www/html/mysite/images/ -type f -print0 | xargs -0 chmod -v 664

2
Simone