Windows 上 PHP move_uploaded_file() 上传文件不继承目标文件夹的权限,导致上传的文件保存后没有从目标文件夹继承权限,出现一些诡异的权限问题。
在 Windows 操作系统中,给一个文件夹赋予了 NTFS 权限以后,在这个文件中创建的新文件会自动继承文件夹的那些可以继承的权限。在 Windows 的权限模型中,将一个文件从一个文件夹移动到另外一个文件夹,被移动的这个文件不会继承移动后的目标文件夹的任何 NTFS 权限,实际上,移动文件并不会改变被移动文件的权限。
PHP 处理文件上传会先将从客户端接收到的文件保存在一个临时文件夹中,然后将临时文件夹中的临时上传文件保存到最终要保存上传文件的文件夹。PHP move_uploaded_file() 是专门用来从上传临时文件夹转存上传文件的内建函数,它会自动调用 is_uploaded_file() 函数来测试要转存的临时文件是否真的是一个从客户端上传的文件,如果不是就不会转存文件,如果是,会将文件从上传临时文件夹移动到目标文件夹。问题的关键就在于这一步“移动”文件的操作。上传的文件被 PHP 保存在上传临时文件夹以后,继承了临时文件夹的权限,被转存到目标文件夹时由于 Windows 移动文件不改变文件权限,最终保存的文件没有继承到目标文件夹的权限。
要解决 Windows PHP 上传文件不继承目标文件夹权限的问题,可以有两个思路。
一是,修改保存 PHP 上传临时文件的临时文件夹或修改这个文件夹的权限,让这个临时文件夹和最终保存上传文件的目标文件夹有一致的权限。在 Windows 操作系统中,NTFS 权限可以使用以下命令修改。二是,修改 PHP 代码。使用 copy() 和 unlink() 代替 move_uploaded_file()。- <?php
- ...
- if(is_uploaded_file($_FILES['WUXIANCHENG']['tmp_name'])){
- if(copy($_FILES['WUXIANCHENG']['tmp_name'], $_FILES['WUXIANCHENG']['name'])){
- unlink($_FILES['WUXIANCHENG']['tmp_name']);
- }
- }
- ...
- ?>
复制代码 相关链接 move_uploaded_file() icacls ForceCopyAclwithFile MoveSecurityAttributes |
|