Próbuję utworzyć katalog z funkcji mkdir PHP, ale pojawia się błąd w następujący sposób: Warning: mkdir() [function.mkdir]: Permission denied in .... Jak rozwiązać problem?
Próbuję utworzyć katalog z funkcji mkdir PHP, ale pojawia się błąd w następujący sposób: Warning: mkdir() [function.mkdir]: Permission denied in .... Jak rozwiązać problem?
Odpowiedzi:
Wiem, że to stary wątek, ale potrzebuje lepszej odpowiedzi. Nie powinieneś ustawiać uprawnień na 777, jest to problem bezpieczeństwa, ponieważ daje dostęp do odczytu i zapisu na świecie. Może się zdarzyć, że twój użytkownik Apache nie ma uprawnień do odczytu / zapisu w katalogu.
Oto, co robisz w Ubuntu
Upewnij się, że wszystkie pliki należą do grupy i użytkownika Apache. W Ubuntu jest to grupa i użytkownik www-data
chown -R www-data:www-data /path/to/webserver/www
Następnie umożliwiono wszystkim członkom grupy www-data odczyt i zapis plików
chmod -R g+rw /path/to/webserver/www
Funkcja php mkdir()powinna teraz działać bez zwracania błędów
/opt/lampp/htdocs/www/my-app/public/uploads.. Zasadniczo to, co próbuję zrobić, to przesłać pliki do folderu przesyłania, a także utworzyć foldery albumów (zostanie to zrobione za pomocą php) do przechowywania zdjęć ..
Późna odpowiedź dla osób, które w przyszłości znajdą to w Google. Napotkałem ten sam problem.
UWAGA: JESTEM NA MAC OSX LION
Dzieje się tak, że Apache jest uruchamiany jako użytkownik „_www” i nie ma uprawnień do edycji żadnych plików. Zauważysz, że ŻADNE funkcje systemu plików nie działają przez php.
Jak naprawić:
Otwórz okno wyszukiwarki i na pasku menu wybierz Idź> Idź do katalogu> / private / etc / apache2
teraz otwórz httpd.conf
odnaleźć:
User _www
Group _www
zmień nazwę użytkownika:
User <YOUR LOGIN USERNAME>
Teraz zrestartuj Apache, uruchamiając ten terminal formularza:
sudo apachectl -k restart
Jeśli nadal nie działa, zdarza się, że wykonuję następujące czynności, zanim zrobię to powyżej. Może być powiązany.
Otwórz terminal i uruchom następujące polecenia: (uwaga, moje pliki serwera WWW znajdują się w / Library / WebServer / www. Zmień zgodnie z lokalizacją Twojej witryny)
sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*
_wwwi utworzenie grupy dla Ciebie i Apache. Stwórz nową grupę, powiedz „wezwana” trustedi umieść się _wwww niej. Następnie ustaw jako zaufanego właściciela grupy wszystkich plików w katalogu dokumentów serwera. Na koniec zrób chmod g+rwxw razie potrzeby tylko te pliki, do których Apache potrzebuje dostępu, aby trustedgrupa miała uprawnienia do edycji plików.
Odpowiedzi zawierające tylko łącza nie są uważane za dobrą praktykę w StackOverflow, ale podana tutaj rada zasadniczo NIE powinna być stosowana.
Chciałbym wrócić do tej wspaniałej odpowiedzi na podobne pytanie . Cytuję:
Proszę, przestań sugerować użycie 777. Uczyniasz swój plik możliwym do zapisu przez wszystkich, co właściwie oznacza, że tracisz wszelkie zabezpieczenia, dla których został zaprojektowany system uprawnień. Jeśli to zasugerujesz, pomyśl o konsekwencjach, jakie może to mieć na źle skonfigurowanym serwerze internetowym: niezwykle łatwo byłoby „zhakować” witrynę, nadpisując pliki. Więc nie rób tego.
Fix uprawnienia katalogu próby utworzenia katalogu w .
Wiem, że ten wątek jest stary, ale może to komuś kiedyś pomoże.
Problem dlaczego PHP mówi "Odmowa uprawnień" dla mkdir () - zła ścieżka url. Aby to naprawić, wystarczy uzyskać prawidłową ścieżkę. Zrobiłem to w ten sposób:
<?php
$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';
if( !file_exists($dir) ) {
mkdir($dir, 0755, true);
}
?>
Aby utworzyć katalog, musisz mieć uprawnienia systemu plików.
Przykład: W Ubuntu 10.04 apache (php) działa jako user: www-data w grupie: www-data
Oznacza to, że użytkownik www-data potrzebuje dostępu, aby utworzyć katalog.
Możesz spróbować samemu, używając: „su www-data”, aby stać się użytkownikiem www-data.
Jako szybką naprawę możesz zrobić: sudo chmod 777 my_parent_dir
chmod 0777umożliwi odczyt i zapis na świecie! Nie powinieneś doradzać czegoś takiego. Jednak rada z grupą użytkowników jest obecnie najlepsza tutaj :)
Inną rzeczą, którą możesz zrobić, jest przejście do: / etc / sudoers
Dodaj następujący wiersz, który daje uprawnienia temu użytkownikowi www-data ALL = (ALL: ALL) ALL Dlaczego dane www? dzieje się tak, ponieważ Apache działa pod tą nazwą użytkownika.
Jeśli twój użytkownik jest inny, wypróbuj nazwę użytkownika ALL = (ALL: ALL) ALL
To zadziałało dla mnie.
sudoersbezpośrednio, ale zaloguj się jako root i użyj visudopolecenia te : które sprawdza wszelkie zmiany, aby uniknąć błędnych edycji, które mogą powodować błędy parsowania podczas ładowania pliku sudoers, co może pozostawić Cię bezsilnym (jak w przypadku braku uprawnień do zmienić cokolwiek)
Ponieważ korzystasz z komputera Mac, możesz dodać siebie do grupy _www (grupa użytkowników Apache) na komputerze Mac:
sudo dseditgroup -o edit -a $USER -t user _www
i dodaj użytkownika _www do grupy kół, która wydaje się być tym, co Mac tworzy pliki jako:
sudo dseditgroup -o edit -a _www -t user wheel
Mam ten problem właśnie teraz, moim najlepszym rozwiązaniem, jakie mogę Ci teraz dać (mimo że nie dołączyłeś żadnego kodu) to:
Jeśli używasz polecenia rekurencyjnego do tworzenia podfolderów, nie zapomnij umieścić 0755 (pamiętaj, aby na początku dołączyć 0) do polecenia mkdir, np:
if(!file_exists($output)){
if (!mkdir($output, 0755, true)) {//0755
die('Failed to create folders...');
}
}To też działa dla mnie teraz.
Jeśli używasz LINUX-a, najpierw sprawdźmy użytkownika Apache, ponieważ w niektórych dystrybucjach może być inaczej:
egrep -i '^user|^group' /etc/httpd/conf/httpd.conf
Powiedzmy, że wynikiem jest „http”. Wykonaj następujące czynności, pamiętaj tylko o zmianie path_to_folder na ścieżkę folderów:
chown -R http:http path_to_folder
chmod -R g+rw path_to_folder
sprawdź, czy to nie jest problem z 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);
}
}
}
}
Po zainstalowaniu serwera ftp sudo apt-get install vsftpdbędziesz musiał go skonfigurować. Aby umożliwić zapis, musisz edytować /etc/vsftpd.confplik i odkomentować plik
#write_enable=YES
wiersz, więc powinien przeczytać
write_enable=YES
Zapisz plik i uruchom ponownie za vsftpdpomocą sudo service vsftpd restart.
Inne opcje konfiguracji można znaleźć w tej dokumentacji lubman vsftpd.conf
Ten błąd występuje, jeśli używasz złej ścieżki.
Na przykład:
Używam systemu Ubuntu, a nazwa mojego folderu projektu to „myproject”
Załóżmy, że mam katalog myproject / public / report i chcę utworzyć nowy folder o nazwie zamówienia
Następnie potrzebuję całej ścieżki, na której istnieje mój projekt. Możesz uzyskać ścieżkę za pomocą polecenia PWD
Więc moja ścieżka główna będzie wyglądać następująco = '/ home / htdocs / myproject /'
$ dir = '/ home / htdocs / myproject / public / report / Orders';
if (!is_dir($dir)) {
mkdir($dir, 0775, true);
}
To zadziała dla Ciebie !! Cieszyć się !!