PHP:在move_uploaded_file()后添加写入权限到文件

7

在使用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。GD正常工作。

1
什么是 ABSPATH?我猜测 ABSPATH 和相对的 uploads 目录指向不同的位置。 - Phil
ABS_PATH 是文件夹的绝对路径前缀,例如 /var/www/。由于上传成功,绝对路径和相对路径都指向同一文件夹。 - Raptor
1个回答

16

看起来你需要交换最后两行,例如:

$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__始终包含当前文件所在的父目录的绝对路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接