Eu estou tentando criar um diretório com a função mkdir PHP, mas eu recebo um erro como segue: Warning: mkdir() [function.mkdir]: Permission denied in ...
. Como resolver o problema?
Eu estou tentando criar um diretório com a função mkdir PHP, mas eu recebo um erro como segue: Warning: mkdir() [function.mkdir]: Permission denied in ...
. Como resolver o problema?
Respostas:
Eu sei que este é um tópico antigo, mas precisa de uma resposta melhor. Você não deve precisar definir as permissões para 777, que é um problema de segurança, pois dá acesso de leitura e gravação para o mundo. Pode ser que o seu usuário apache não tenha permissões de leitura / gravação no diretório.
Aqui está o que você faz no Ubuntu
Certifique-se de que todos os arquivos pertencem ao grupo e usuário Apache. No Ubuntu é o grupo www-data e o usuário
chown -R www-data:www-data /path/to/webserver/www
Em seguida, habilitou todos os membros do grupo www-data a ler e gravar arquivos
chmod -R g+rw /path/to/webserver/www
A mkdir()
função php agora deve funcionar sem retornar erros
/opt/lampp/htdocs/www/my-app/public/uploads
.. Basicamente o que estou tentando fazer é que cada usuário logado carregue arquivos dentro da pasta de uploads e também crie pastas de álbuns (isso será feito com php) para armazenar fotos ..
Resposta tardia para pessoas que encontrarão isso no Google no futuro. Eu tive o mesmo problema.
NOTA: ESTOU NO MAC OSX LION
O que acontece é que o apache está sendo executado como o usuário "_www" e não tem permissão para editar nenhum arquivo. Você notará que nenhuma função do sistema de arquivos funciona via php.
Como consertar:
Abra uma janela de localização e, na barra de menus, escolha Ir> Ir para a pasta> / private / etc / apache2
agora abra httpd.conf
encontrar:
User _www
Group _www
mude o nome de usuário:
User <YOUR LOGIN USERNAME>
Agora reinicie o apache executando este terminal de formulário:
sudo apachectl -k restart
Se ainda não funcionar, eu faço o seguinte antes de fazer o acima. Pode estar relacionado.
Abra o terminal e execute os seguintes comandos: (observe, meus arquivos do servidor da web estão localizados em / Library / WebServer / www. Altere de acordo com a localização do seu site)
sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*
_www
e criar um grupo para você e o Apache. Faça um novo grupo, digamos chamado trusted
, e coloque-se _www
nele. Em seguida, torne confiável o proprietário do grupo de todos os arquivos no diretório de documentos do servidor. Finalmente, faça o que chmod g+rwx
for necessário apenas nos arquivos que o Apache precisa acessar, de modo que o trusted
grupo tenha permissão para editar os arquivos.
As respostas apenas com links não são consideradas boas práticas no StackOverflow, mas o conselho que é fornecido aqui geralmente NÃO deve ser seguido.
Eu gostaria de voltar a esta ótima resposta em uma pergunta semelhante . Eu cito:
Pare de sugerir o uso de 777. Você está tornando seu arquivo gravável por todos, o que significa que você perde toda a segurança para a qual o sistema de permissão foi projetado. Se você sugerir isso, pense nas consequências que isso pode ter em um servidor web mal configurado: seria incrivelmente fácil "hackear" o site, sobrescrevendo os arquivos. Então, não faça isso.
Corrigir as permissões do diretório que você tentar criar um diretório no .
Sei que esse tópico é antigo, mas talvez isso ajude alguém, um dia.
O problema por que o PHP diz "Permissão negada" para mkdir () - caminho de url errado. Então, para consertar, tudo que você precisa é obter o caminho correto. Eu fiz assim:
<?php
$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';
if( !file_exists($dir) ) {
mkdir($dir, 0755, true);
}
?>
Você precisa ter permissão do sistema de arquivos para criar o diretório.
Exemplo: No Ubuntu 10.04 apache (php) é executado como usuário: www-data no grupo: www-data
Significa que o usuário www-data precisa de acesso para criar o diretório.
Você pode tentar fazer isso usando: 'su www-data' para se tornar o usuário www-data.
Como uma solução rápida, você pode fazer: sudo chmod 777 my_parent_dir
chmod 0777
dará acesso de leitura e escrita ao mundo! Você não deve aconselhar algo assim. No entanto, o conselho com o grupo de usuários é atualmente o melhor aqui :)
Outra coisa que você pode fazer é acessar: / etc / sudoers
Adicione a seguinte linha que dá permissão a esse usuário www-data ALL = (ALL: ALL) ALL Por que www-data? isso ocorre porque o apache está sendo executado por este nome de usuário.
Caso seu usuário seja diferente, tente o nome de usuário ALL = (ALL: ALL) ALL
Isso funcionou para mim.
sudoers
diretamente, mas faça login como root e use o visudo
comando te : que verifica todas as alterações para evitar edições defeituosas, que pode causar erros de análise quando o arquivo sudoers é carregado, o que pode deixá-lo impotente (como em nenhum direito de mudar qualquer coisa)
Estou com este problema agora, minha melhor solução que posso dar a você agora (apesar de você não ter incluído nenhum de seu código) seria:
Se você estava usando o comando recursivo para criar subpastas, não se esqueça de colocar 0755 (lembre-se de incluir 0 no início) no comando mkdir, por exemplo:
if(!file_exists($output)){
if (!mkdir($output, 0755, true)) {//0755
die('Failed to create folders...');
}
}
Isso também funcionou para mim agora.
Se você estiver usando o LINUX, primeiro vamos verificar o usuário do apache, já que em algumas distros pode ser diferente:
egrep -i '^user|^group' /etc/httpd/conf/httpd.conf
Digamos que o resultado seja "http". Faça o seguinte, lembre-se de alterar path_to_folder para folders path:
chown -R http:http path_to_folder
chmod -R g+rw path_to_folder
verifique se não é um problema com 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);
}
}
}
}
Depois de instalar o servidor ftp, sudo apt-get install vsftpd
você terá que configurá-lo. Para habilitar o acesso de gravação, você deve editar o /etc/vsftpd.conf
arquivo e descomentar o
#write_enable=YES
linha, então deve ser
write_enable=YES
Salve o arquivo e reinicie vsftpd
comsudo service vsftpd restart
.
Para outras opções de configuração, consulte esta documentação ouman vsftpd.conf
Este erro ocorre se você estiver usando o caminho errado.
Por exemplo:
Estou usando o sistema Ubuntu e o nome da minha pasta de projeto é 'myproject'
Suponha que eu tenha o diretório myproject / public / report e queira criar uma nova pasta chamada orders
Então eu preciso de todo um caminho onde meu projeto exista. Você pode obter o caminho pelo comando PWD
Portanto, meu caminho de raiz será = '/ home / htdocs / myproject /'
$ dir = '/ home / htdocs / myproject / public / report / Orders';
if (!is_dir($dir)) {
mkdir($dir, 0775, true);
}
Vai funcionar para você !! Aproveitar !!