我在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移动文件。
答案 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的安全功能,我可以在上面代码的第一次重命名调用中使用该功能。