2013-03-02 17 views
5

Mam problemy ze skryptem przesyłania obrazów.php chmod() nie zmienia uprawnień

Wiem, że są setki takich samych pytań, ale nie znalazłem tego, który byłby dla mnie.

$upload_dir = "images/postcards/"; 
chmod($upload_dir, 777); 
if (is_writable($upload_dir)) { 
    echo 'The file is writable'; 
} else { 
    echo 'The file is not writable'; 
} 

To zawsze wraca, że ​​plik nie jest "zapisu"

Próbowałem ustawienie chmod do 0777 i -rwxrwxrwx. Ale wynik był zawsze taki sam. Jakieś pomysły?

+1

w przypadku dziesiętnych '777' jest niepoprawny. powinieneś zawsze poprzedzić '0' sprawdzeniem tutaj [chmod] (http://php.net/manual/en/function.chmod.php). –

Odpowiedz

9

Katalog musi należeć do użytkownika wywołującego skrypt (zazwyczaj www-data, apache lub httpd, jeśli skrypt jest uruchamiany w konfiguracji apache/* NIX). Użytkownik nie może ustawić 777 uprawnień dla katalogów, które nie są jego własnością.

Zobacz notatkę na chmod() manual:

Bieżący użytkownik to użytkownik pod którym biegnie PHP. Prawdopodobnie nie jest to ten sam użytkownik, którego używasz do normalnego dostępu do powłoki lub FTP. Tryb może być zmieniony tylko przez użytkownika, który jest właścicielem pliku w większości systemów.

+0

Uzgodnione z punktem 'katalog musi być własnością użytkownika '. –

2

pierwsze, otwarte PHP error_report dodając dwa linię na górnej części kodu, sprawdź, czy nie ma błędów pochodzących z chmod:

ini_set('display_errors', true); 
error_reporting(E_ALL); 

Upewnij się na serwer ma uprawnienia do tego katalogu, mój domyślam się, że WebServer nie ma pozwolenia.

+0

omg bardzo dziękuję za zgłoszenie błędu. Uderzyłem głową o ścianę, próbując zainstalować takie rzeczy jak Chrome Logger, aby uzyskać raportowanie błędów dla php. – user124384

0

już miałem ten sam problem można zmienić pozwolenie pliku poprzez ten kod:

<?php 
$ftp_details['ftp_user_name'] = 'your ftp username'; 
$ftp_details['ftp_user_pass'] = 'your ftp password'; 
$ftp_details['ftp_root'] = '/public_html/'; 
$ftp_details['ftp_server'] = 'ftp' . $_SERVER['HTTP_HOST']; 
function ftp_chmod($path, $mod, $ftp_details) { 
    extract($ftp_details); 
    $conn_id = ftp_connect($ftp_server); 
    $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); 

// try to chmod $path directory 
    if (ftp_site($conn_id, 'CHMOD ' . $mod . ' ' . $ftp_root . $path) !== false) { 
    $success = true; 
    } 
    else { 
    $success = false; 
    } 

    ftp_close($conn_id); 
    return $success; 
} 
?> 

nie uruchomić ten kod, ale myślę, że jest OK i to pomoże. powiedz mi, jeśli Twoje problemy zostały rozwiązane.

0

Miałem podobne problemy używając chmod, chociaż plik był własnością Apache: Apache (użytkownik serwera WWW). W moim przypadku SELinux był już w drodze, to wyłączenie to jasno:

sudo setenforce 0

a prace chmod. Teraz, aby dowiedzieć się, jak zrobić wyjątek SELinux dla tej sprawy ... (i nie zapomnij włączyć SELinux, oczywiście)

+0

Ulepsz swoją odpowiedź, aby była bardziej wyczerpująca. –

+0

To jest najlepsza odpowiedź dla mojego konkretnego przypadku, ponieważ miałem prawidłowy zbiór użytkownika i grupy dla pliku. Również na temat konfiguracji serwerów, znalazłem także, że ustawienie nowej 'umask' dla mojego serwera internetowego było najlepszą opcją: http://serverfault.com/a/384922/185510 – RibeiroBreno

Powiązane problemy