Je suis en train de créer un répertoire avec la fonction PHP mkdir mais je reçois une erreur comme suit: Warning: mkdir() [function.mkdir]: Permission denied in .... Comment régler le problème?
Je suis en train de créer un répertoire avec la fonction PHP mkdir mais je reçois une erreur comme suit: Warning: mkdir() [function.mkdir]: Permission denied in .... Comment régler le problème?
Réponses:
Je sais que c'est un vieux fil, mais il faut une meilleure réponse. Vous ne devriez pas avoir besoin de définir les autorisations sur 777, c'est un problème de sécurité car cela donne un accès en lecture et en écriture au monde. Il se peut que votre utilisateur apache ne dispose pas des autorisations de lecture / écriture sur le répertoire.
Voici ce que vous faites dans Ubuntu
Assurez-vous que tous les fichiers appartiennent au groupe et à l'utilisateur Apache. Dans Ubuntu, c'est le groupe et l'utilisateur www-data
chown -R www-data:www-data /path/to/webserver/www
Ensuite, tous les membres du groupe www-data ont pu lire et écrire des fichiers
chmod -R g+rw /path/to/webserver/www
La mkdir()fonction php devrait maintenant fonctionner sans renvoyer d'erreurs
/opt/lampp/htdocs/www/my-app/public/uploads.. Fondamentalement, ce que j'essaie de faire est que chaque utilisateur connecté télécharge des fichiers dans le dossier uploads et crée également des dossiers d'albums (cela sera fait avec php) pour stocker des photos ..
Réponse tardive pour les personnes qui trouveront cela via google à l'avenir. J'ai rencontré le même problème.
REMARQUE: JE SUIS SUR MAC OSX LION
Ce qui se passe, c'est qu'apache est exécuté en tant qu'utilisateur "_www" et n'a pas les autorisations pour modifier les fichiers. Vous remarquerez qu'aucune fonction du système de fichiers ne fonctionne via php.
Comment réparer:
Ouvrez une fenêtre de recherche et dans la barre de menus, choisissez Aller> Aller au dossier> / private / etc / apache2
maintenant ouvrez httpd.conf
trouver:
User _www
Group _www
changer le nom d'utilisateur:
User <YOUR LOGIN USERNAME>
Maintenant, redémarrez Apache en exécutant ce terminal de formulaire:
sudo apachectl -k restart
Si cela ne fonctionne toujours pas, il se trouve que je fais ce qui suit avant de faire ce qui précède. Cela pourrait être lié.
Ouvrez le terminal et exécutez les commandes suivantes: (notez que les fichiers de mon serveur Web se trouvent dans / Bibliothèque / WebServer / www. Changez en fonction de l'emplacement de votre site Web)
sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*
_wwwet de créer un groupe pour vous et Apache. Créez un nouveau groupe, dites appelé trusted, et inscrivez-vous _www. Faites ensuite confiance au propriétaire du groupe de tous les fichiers du répertoire de documents de votre serveur. Enfin, faites le chmod g+rwxcas échéant sur uniquement les fichiers auxquels Apache a besoin d'accéder, afin que le trustedgroupe soit autorisé à modifier les fichiers.
Les réponses aux liens uniquement ne sont pas considérées comme une bonne pratique sur StackOverflow, mais les conseils donnés ici ne doivent généralement PAS être suivis.
Je voudrais revenir sur cette excellente réponse à une question similaire . Je cite:
Veuillez arrêter de suggérer d'utiliser 777. Vous rendez votre fichier accessible en écriture par tout le monde, ce qui signifie à peu près que vous perdez toute la sécurité pour laquelle le système d'autorisation a été conçu. Si vous suggérez cela, pensez aux conséquences que cela peut avoir sur un serveur web mal configuré: il deviendrait incroyablement facile de "pirater" le site, en écrasant les fichiers. Alors, ne le faites pas.
Fixer les permissions du répertoire que vous essayez de créer un répertoire dans .
Je sais que ce fil est vieux, mais peut-être que cela aidera quelqu'un, un jour.
Le problème pour lequel PHP dit "Autorisation refusée" pour mkdir () - chemin d'URL incorrect. Donc, pour résoudre ce problème, tout ce dont vous avez besoin est d'obtenir le chemin correct. Je l'ai fait de cette façon:
<?php
$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';
if( !file_exists($dir) ) {
mkdir($dir, 0755, true);
}
?>
Vous devez disposer de l'autorisation du système de fichiers pour créer le répertoire.
Exemple: dans Ubuntu 10.04, apache (php) s'exécute en tant qu'utilisateur: www-data dans le groupe: www-data
Cela signifie que l'utilisateur www-data a besoin d'un accès pour créer le répertoire.
Vous pouvez l'essayer vous-même en utilisant: 'su www-data' pour devenir l'utilisateur www-data.
En guise de solution rapide, vous pouvez faire: sudo chmod 777 my_parent_dir
chmod 0777donnera un accès en lecture et en écriture au monde! Vous ne devriez pas conseiller quelque chose comme ça. Cependant, le conseil avec le groupe d'utilisateurs est actuellement le meilleur ici :)
L'autre chose que vous pouvez faire est d'aller dans: / etc / sudoers
Ajoutez-y la ligne suivante qui donne la permission à cet utilisateur www-data ALL = (ALL: ALL) ALL Pourquoi www-data? c'est parce qu'apache s'exécute sous ce nom d'utilisateur.
Incase si votre utilisateur est différent, essayez le nom d'utilisateur ALL = (ALL: ALL) ALL
Cela a fonctionné pour moi.
sudoersdirectement, mais connectez-vous en tant que root et utilisez la visudocommande te : qui vérifie les modifications pour éviter les modifications erronées, qui peuvent provoquer des erreurs d'analyse lorsque le fichier sudoers est chargé, ce qui pourrait vous laisser impuissant (car aucun droit à changer quoi que ce soit)
Puisque vous êtes sur un mac, vous pouvez vous ajouter au groupe _www (le groupe d'utilisateurs apache) sur votre mac:
sudo dseditgroup -o edit -a $USER -t user _www
et ajoutez l'utilisateur _www au groupe de roues qui semble être ce que le mac crée des fichiers comme:
sudo dseditgroup -o edit -a _www -t user wheel
J'ai ce problème tout à l'heure, ma meilleure solution que je puisse vous donner pour le moment (bien que vous n'ayez inclus aucun de votre code) serait:
Si vous utilisiez la commande récursive pour créer des sous-dossiers, n'oubliez pas de mettre 0755 (n'oubliez pas d'inclure 0 au début) dans la commande mkdir, par exemple:
if(!file_exists($output)){
if (!mkdir($output, 0755, true)) {//0755
die('Failed to create folders...');
}
}Cela a également fonctionné pour moi en ce moment.
Si vous utilisez LINUX, vérifions d'abord l'utilisateur d'Apache, car dans certaines distributions, cela peut être différent:
egrep -i '^user|^group' /etc/httpd/conf/httpd.conf
Disons que le résultat est "http". Faites ce qui suit, souvenez-vous simplement de changer path_to_folder en chemin de dossiers:
chown -R http:http path_to_folder
chmod -R g+rw path_to_folder
vérifier si ce n'est pas un problème avec umask
if (!function_exists('mkdir_r')) {
/**
* create directory recursively
* @param $dirName
* @param int $rights
* @param string $dir_separator
* @return bool
*/
function mkdir_r($dirName, $rights = 0744, $dir_separator = DIRECTORY_SEPARATOR) {
$dirs = explode($dir_separator, $dirName);
$dir = '';
$created = false;
foreach ($dirs as $part) {
$dir .= $part . $dir_separator;
if (!is_dir($dir) && strlen($dir) > 0) {
$created = mkdir($dir, $rights);
}
}
return $created;
}
}
if (!function_exists('ensure_dir')) {
/**
* ensure directory exist if not create
* @param $dir_path
* @param int $mode
* @param bool $use_mask
* @param int $mask
* @return bool
*/
function ensure_dir($dir_path, $mode = 0744, $use_mask = true, $mask = 0002) {
// set mask
$old_mask = $use_mask && $mask != null
? umask($mask)
: null;
try {
return is_dir($dir_path) || mkdir_r($dir_path, $mode);
} finally {
if ($use_mask && $old_mask != null) {
// restore original
umask($old_mask);
}
}
}
}
Après avoir installé le serveur ftp avec sudo apt-get install vsftpdvous devrez le configurer. Pour activer l'accès en écriture, vous devez modifier le /etc/vsftpd.conffichier et décommenter le
#write_enable=YES
ligne, donc il devrait lire
write_enable=YES
Enregistrez le fichier et redémarrez vsftpdavec sudo service vsftpd restart.
Pour d'autres options de configuration, consultez cette documentation ouman vsftpd.conf
Cette erreur se produit si vous utilisez le mauvais chemin.
Par exemple:
J'utilise le système ubuntu et le nom de mon dossier de projet est 'myproject'
Supposons que le répertoire myproject / public / report existe et que je souhaite créer un nouveau dossier appelé orders
Ensuite, j'ai besoin d'un chemin complet où mon projet existe. Vous pouvez obtenir le chemin par la commande PWD
Mon chemin racine sera donc = '/ home / htdocs / myproject /'
$ dir = '/ home / htdocs / monprojet / public / rapport / Commandes';
if (!is_dir($dir)) {
mkdir($dir, 0775, true);
}
Cela fonctionnera pour vous !! Prendre plaisir !!