Linux Apache / PHP文件上传:move_uploaded_file发出错误

时间:2017-05-18 12:21:12

标签: php linux apache file-upload

我在Debian Jessie机器上设置了一个apache2 webserver。我在http://php.net/manual/en/function.move-uploaded-file.php之后使用PHP脚本将文件上传到服务器。

我已经设置了/etc/php/apache/php.ini来启用文件上传,我可以正常上传文件。

我希望上传的文件的权限设置为0664.阅读了Stack Overflow,在/ etc / apache2 / envvars中我已经完成了

umask 002

我认为应该将PHP解释器umask设置为从apache派生,即002。

文件上传目录的所有权和权限设置为www-data:www-data 770(即apache用户)。

但是,当我使用move_uploaded_file将临时PHP文件移动到上传目录时,文件权限为600,即不保留组权限。

任何人都可以提出任何可能出错的想法吗?

根据以下评论,我应该声明我希望已移动的文件具有0664权限。

我也试过这个:

chmod($_FILES['file']['tmp_name'], 0664);
rename($_FILES['file']['tmp_name'], $new_filename);

而且:

chmod($_FILES['file']['tmp_name'], 0664);
copy($_FILES['file']['tmp_name'], $new_filename);

但这不起作用,在这两种情况下,我仍然可以获得0600移动文件。

3 个答案:

答案 0 :(得分:1)

对于任何上传的文件,

move_uploaded-file始终将权限设置为600,无论apache umask中的任何配置如何设置。 您可以在上传文件和设置权限时在代码的上下文中使用chmod。

chmod($target_path, 0664);

http://php.net/manual/en/function.move-uploaded-file.php 在评论部分,其他用户也有同样的问题,因此他们描述的是相同的事情。

答案 1 :(得分:0)

我不知道您的尝试可能出现了什么问题,但您可以在移动上传的文件后立即使用php chmod功能。

示例:

$destination = '/absolute/path/to/upload/' . $filename;

if (move_uploaded_file($filename, $destination)) {
    chmod($destination, 0664);
}

修改

在使用move_uploaded_file()之后使用chmod()之后的,如上例所示,对move_uploaded_file()的第二个参数使用相同的 $ destination 变量, chmod()的第一个参数。

答案 2 :(得分:0)

正如sahil kataria正确指出的那样,move_uploaded_file强制目标文件权限为0600。

当我希望它登陆时,我需要0660对目录中文件的权限。我最终使用的解决方法是

rename($_FILES['file']['tmp_name'], $another_temporary_file);
chmod($another_temporary_file, 0660);
rename($another_temporary_file, $final_destination_file);

这会强制我想要的权限,并在将文件移动到最终目的地时保留它们。

要利用move_uploaded_file的安全功能,我可以在上面代码的第一次重命名调用中使用该功能。