Chmod 666 и отказ в доступе для getimagesize

Прежде всего, это не дубликат: отказано в разрешении на getimagesize

У меня есть следующий код, где я поместил chmod для изображения, а затем я не хочу получать его размер.

@chmod($path."/".$filename, '0666');
getimagesize($path . "/" . $filename);

Но если я устанавливаю chmod, я получаю это сообщение об ошибке:

не удалось открыть поток: в доступе отказано[...]

В чем проблема? Все файлы и каталог имеют одну и ту же группу и владельца - www-data.


person Cyclone    schedule 18.10.2011    source источник


Ответы (3)


На самом деле вам действительно нужно chmod перед getimagesize?

если так, может быть, вы можете попробовать поставить umask перед chmod. что-то вроде этого?

$old = umask(0); 
chmod($path,0777);
umask($old);
person NineAllexis    schedule 18.10.2011
comment
Просто любопытно; что заставило это работать в отличие от других решений? И что именно делает umask в этом случае? - person poplitea; 18.10.2011
comment
в основном это только дает PHP-запросу временный доступ, а затем устанавливает его обратно после того, как вы выполните chmod. - person NineAllexis; 19.10.2011

Попробуйте поставить / перед путем. Не уверен насчет php, но я знаю, что python не добавит начальный / к определенным операциям пути, поэтому он может искать относительный путь вместо абсолютного:

@chmod("/". $path."/".$filename, '0666');
getimagesize("/". $path . "/" . $filename);
person chown    schedule 18.10.2011
comment
У него уже есть абсолютный путь. $path = dirname(__FILE__); - person Cyclone; 18.10.2011
comment
Ах, тогда это все, что у меня есть, извините @Cyclone :/. - person chown; 18.10.2011
comment
Без проблем. Проголосовал за попытку ;) - person Cyclone; 18.10.2011

Прежде всего, chmod не удастся (разрешение будет отклонено; может быть, ошибка, которую вы получаете, связана с chmod?), если www-data (при условии, что это пользователь вашего веб-сервера) не имеет права записи в каталог $path. Убедитесь, что www-data имеет права на чтение всех родительских каталогов $path и права на запись в $path.

Также убедитесь, что вы используете абсолютные пути как в chmod, так и в getimagesize.

person poplitea    schedule 18.10.2011
comment
Что вы имеете в виду, говоря об абсолютном пути? И да, www-data имеет разрешение на чтение для всех родительских каталогов. Я создаю свой путь следующим образом: pastebin.com/hj0SUQmF - person Cyclone; 18.10.2011
comment
Абсолютный путь начинается с / и указывает полный путь (все каталоги) от корня файловой системы до рассматриваемого файла. См.: en.wikipedia.org/wiki/Абсолютный_путь#Unix_style - person poplitea; 18.10.2011
comment
У него уже есть абсолютный путь. $path = dirname(__FILE__); dirname возвращает абсолютный путь. - person Cyclone; 18.10.2011
comment
@Cyclone Да, я понял это из твоего pastebin. Извините, что не упомянул об этом. Попробуйте заменить первую строку на print chmod(...); и посмотрите, печатает ли она True, 1 или что-то в этом роде — просто чтобы убедиться, что chmod действительно работает. - person poplitea; 18.10.2011
comment
Это работает, так как когда я удаляю строку с @chmod~, ошибок нет и все работает, но тогда у моего изображения есть странный chmod 1664. - person Cyclone; 18.10.2011
comment
Значит getimagesize работает без chmod? Пожалуйста, уточните, что работает, а что нет, я запутался в вашем последнем комментарии. - person poplitea; 18.10.2011
comment
Когда мой chmod изменен на 666, как здесь: pastebin.com/hj0SUQmF. Затем я получил сообщение об ошибке с отказом в доступе. - person Cyclone; 18.10.2011