PHP: добавить разрешение на запись в файл после move_uploaded_file()

После загрузки изображения с помощью PHP я хочу сделать файл изображения доступным для записи, чтобы добавить к нему водяной знак. Вот коды, которые я использовал:

if(isset($_FILES['file_poster']['tmp_name']) && $_FILES['file_poster']['tmp_name'] != '') {
        $random_filename = substr(md5(time()), 0, 9);
        $ext = '.jpg';
        if(strpos(strtolower($_FILES['file_poster']['name']), '.png') > -1) {
            $ext = '.png';
        }

        move_uploaded_file($_FILES['file_poster']['tmp_name'], 'uploads/' .  $random_filename . $ext);
        chmod(ABS_PATH . $random_filename, 0666);
        $random_filename = 'uploads/' .  $random_filename . $ext;

        // add watermark codes omitted
}

После загрузки файла права доступа становятся 644. Затем я попытался использовать chmod(), чтобы изменить его на доступный для записи ( 666 ), но разрешение не изменилось.

Папка /uploads имеет разрешение 777. Есть ли причина, по которой функция chmod() не может изменить разрешение? или есть обходной путь?

Примечание: используется PHP 5. ГД работает исправно.


person Raptor    schedule 07.03.2013    source источник
comment
Что такое ABSPATH? Я предполагаю, что ABSPATH и относительный каталог uploads указывают на разные места   -  person Phil    schedule 07.03.2013
comment
ABS_PATH — префикс абсолютного пути к папке, например. /var/www/. Абсолютный и относительный пути указывают на одну и ту же папку, так как загрузка прошла успешно.   -  person Raptor    schedule 07.03.2013


Ответы (1)


Похоже, вам нужно поменять местами последние две строки, например

$random_filename = 'uploads/' .  $random_filename . $ext;
chmod(ABS_PATH . $random_filename, 0666);

Будьте очень осторожны при использовании относительных путей, таких как 'uploads/' . $random_filename . $ext. Если рабочий файл включен в другой файл, текущий каталог может отличаться.

Я бы порекомендовал что-то вроде этого

$destFile = __DIR__ . '/uploads/' . $random_filename . $ext;
move_uploaded_file($_FILES['file_poster']['tmp_name'], $destFile);
chmod($destFile, 0666);

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

person Phil    schedule 07.03.2013