2013-03-02 2 views
5

У меня возникли проблемы с загрузкой изображения.php chmod() не меняются разрешения

Я знаю, что есть сотни одинаковых вопросов, но я не нашел тот, который будет работать для меня.

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

Это всегда возвращается, что файл "не доступен для записи"

Я попытался установить chmod в 0777 и -rwxrwxrwx. Но результат всегда был один и тот же. Есть идеи?

+1

в случае десятичной '777' неверно. вы всегда должны указывать опцию '0' здесь [chmod] (http://php.net/manual/en/function.chmod.php). –

ответ

9

Директория должна принадлежать пользователю, вызывающему сценарий (обычно www-data, apache или httpd, если вы используете скрипт в настройке apache/* NIX). Пользователь не может установить 777 прав на каталоги, которые он не имеет.

Смотрите примечание на CHMOD() manual:

Текущий пользователь является пользователем, под которым работает PHP. Вероятно, это не тот же пользователь, которого вы используете для обычного доступа к оболочке или FTP. Режим может быть изменен только пользователем, которому принадлежит файл на большинстве систем.

+0

Согласовано с пунктом 'каталог должен принадлежать пользователю'. –

2

Во-первых, откройте PHP error_report, добавив две строки в верхней части кода, посмотреть, если есть ошибка приходит от CHMOD:

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

Убедитесь, что ваш WebServer имеет разрешение на этот каталог, мой Угадайте, что у WebServer нет разрешения.

+0

omg Большое спасибо за сообщение об ошибке. Я бил головой о стену, пытаясь установить такие вещи, как Chrome Logger, чтобы получить отчет об ошибках для php. – user124384

0

я уже была та же самая проблема, которую вы можете изменить разрешение файла с помощью этого кода:

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

Я не запускать этот код, но я думаю, что это нормально, и это поможет вам. скажите мне, если ваши проблемы решены.

0

У меня были схожие проблемы с использованием chmod, хотя файл принадлежал apache: apache (пользователь веб-сервера). В моем случае SELinux получал в пути, отключении он сделал этот ясный:

SUDO setenforce 0

И в CHMOD работы. Теперь выясним, как сделать исключение SELinux для этого случая ... (и не забудьте включить SELinux, конечно)

+0

Улучшите свой ответ, чтобы сделать его более полным. –

+0

Это лучший ответ для моего конкретного случая, поскольку у меня был правильный пользовательский и групповой набор для файла. Также по теме конфигураций сервера я также обнаружил, что установка нового 'umask' для моего веб-сервера была наилучшим вариантом: http://serverfault.com/a/384922/185510 – RibeiroBreno