Windows开发环境下如何让新上传文件继承文件夹权限?
解决Windows服务器下PHP上传文件权限不继承问题
问题原因
Windows环境中,PHP通过move_uploaded_file上传的文件,其权限由服务器运行进程(如IIS的IUSR账户、Apache服务账户)的权限决定,不会自动继承父文件夹的权限设置——即便父文件夹配置了Everyone读取权限,新上传的文件仍可能没有任何用户的访问权限。
解决方案
1. 上传后用PHP的chmod设置权限
在文件上传完成后,直接通过chmod命令设置文件的可读权限,对应Windows下Everyone的读取权限:
$nameOfImage = $scanning->getId() . $token . '_scanning.' . pathinfo($_FILES['photo']['name'], PATHINFO_EXTENSION); $targetPath = './patient/files/import/scans/' . $nameOfImage; move_uploaded_file($_FILES['photo']['tmp_name'], $targetPath); // 设置文件权限为所有者读写,其他用户只读,对应Windows的Everyone读取权限 chmod($targetPath, 0644);
2. 用Windows原生icacls命令添加权限
如果chmod效果不符合预期,可直接调用Windows的icacls工具给文件添加Everyone的读取权限:
$nameOfImage = $scanning->getId() . $token . '_scanning.' . pathinfo($_FILES['photo']['name'], PATHINFO_EXTENSION); $targetPath = './patient/files/import/scans/' . $nameOfImage; move_uploaded_file($_FILES['photo']['tmp_name'], $targetPath); // 执行icacls命令授予Everyone读取权限 exec('icacls "' . $targetPath . '" /grant Everyone:R');
3. 修复父文件夹的权限继承设置
如果之前修改父文件夹权限未生效,需检查权限继承配置:
- 右键目标父文件夹
./patient/files/import/scans/,打开「属性」→「安全」→「高级」 - 确保「包括可从该对象的父项继承的权限」选项已勾选
- 点击「应用」保存设置,重新上传文件测试
额外注意事项
确保服务器运行的账户(如IIS的IUSR、IIS_IUSRS,或Apache的服务账户)对目标文件夹拥有写入权限,否则不仅无法上传文件,后续修改权限的操作也会失败。
内容的提问来源于stack exchange,提问作者dgnotset
相关产品推荐
相关产品推荐

