2013-03-02 32 views
5

Tôi gặp sự cố với tập lệnh tải lên hình ảnh.php chmod() không thay đổi quyền

Tôi biết có hàng trăm câu hỏi giống nhau, nhưng tôi chưa tìm thấy câu hỏi phù hợp với mình.

$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'; 
} 

này luôn trả rằng tập tin là "không ghi được"

tôi đã cố gắng thiết lập chmod-0777-rwxrwxrwx. Nhưng kết quả luôn giống nhau. Bất kỳ ý tưởng?

+1

trong trường hợp thập phân '777' không chính xác. bạn nên luôn luôn tiền tố với '0' kiểm tra ở đây [chmod] (http://php.net/manual/en/function.chmod.php). –

Trả lời

9

Thư mục phải được sở hữu bởi người dùng gọi tập lệnh (thường là www-data, apache hoặc httpd nếu bạn đang chạy tập lệnh trong thiết lập apache/* NIX). Người dùng không thể đặt quyền 777 đối với các thư mục mà nó không sở hữu.

Xem ghi chú trên chmod() manual:

Người dùng hiện nay là người sử dụng, theo đó PHP chạy. Có thể không phải là cùng một người dùng mà bạn sử dụng cho trình duyệt thông thường hoặc truy cập FTP. Chế độ có thể là đã thay đổi chỉ bởi người dùng sở hữu tệp trên hầu hết các hệ thống.

+0

Đồng ý với thư mục 'điểm phải được sở hữu bởi người dùng'. –

2

Đầu tiên, mở PHP error_report bằng cách thêm hai dòng trên đầu trang của mã của bạn, xem nếu có một lỗi đến từ chmod:

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

Hãy chắc chắn rằng WebServer của bạn có sự cho phép vào thư mục đó, tôi đoán là WebServer không được phép.

+0

omg cảm ơn rất nhiều vì báo cáo lỗi. Tôi đã bashing đầu của tôi chống lại bức tường cố gắng để cài đặt các công cụ như Chrome Logger để có được báo cáo lỗi cho php. – user124384

0

tôi đã có cùng một vấn đề, bạn có thể thay đổi sự cho phép của tập tin bằng cách mã này:

<?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; 
} 
?> 

Tôi không chạy mã này, nhưng tôi nghĩ rằng nó là Ok và nó sẽ giúp bạn. cho tôi biết nếu sự cố của bạn được giải quyết.

0

Tôi đã gặp sự cố tương tự khi sử dụng chmod, mặc dù tệp được sở hữu bởi apache: apache (người dùng máy chủ web). Trong trường hợp của tôi SELinux đã nhận được trong cách, vô hiệu hóa nó nói rõ điều này:

sudo setenforce 0

Và các tác phẩm chmod. Bây giờ, để tìm ra cách tạo ngoại lệ SELinux cho trường hợp này ... (và đừng quên bật SELinux, tất nhiên)

+0

Cải thiện câu trả lời của bạn để làm cho câu trả lời toàn diện hơn. –

+0

Đây là câu trả lời hay nhất cho trường hợp cụ thể của tôi vì tôi đã đặt đúng nhóm người dùng và nhóm cho tệp. Cũng trên chủ đề cấu hình máy chủ, tôi cũng thấy rằng việc đặt một 'umask' mới cho máy chủ web của tôi là tùy chọn tốt nhất: http://serverfault.com/a/384922/185510 – RibeiroBreno

Các vấn đề liên quan