根本原因是apache或php-fpm进程用户无upload_tmp_dir目录写权限;windows需用icacls授予nt authority\system完全控制权,linux需chown匹配apache运行用户且chmod 700,重启服务后通过$_files['file']验证路径。

upload_tmp_dir 配置后 move_uploaded_file() 仍失败?权限才是真因
改了 php.ini 里的 upload_tmp_dir 却还是报 Failed to move uploaded file 或 Unable to move,大概率不是路径写错了,而是 Apache 进程根本没权限往那个目录里写。Windows 下 XAMPP 的 Apache 默认以 NT AUTHORITY\SYSTEM 身份运行,它对新建的 C:\xampp\tmp 目录默认无写权;Linux/macOS 类似,但用户通常是 daemon 或 www-data。
常见错误现象包括:
-
move_uploaded_file(): Unable to move ... No such file or directory(路径存在但报“no such file”,其实是权限拒绝的伪装) - 连带影响
session_start()失败,提示open(.../sess_xxx, O_RDWR) failed: No such file or directory - PHP 错误日志里反复出现
Warning: Failed to write session data
Windows 下用 icacls 精确授权(别信右键属性界面)
图形界面点“安全”→“编辑”→加用户,容易漏掉继承权限,导致子目录或新文件仍不可写。必须用命令行强制设置对象继承(OI)和容器继承(CI)。
- 先确保目录存在:
mkdir C:\xampp\tmp - 以管理员身份打开 CMD,执行:
icacls "C:\xampp\tmp" /grant "NT AUTHORITY\SYSTEM:(OI)(CI)F" /T -
(OI)表示该权限应用于目录内所有文件,(CI)表示应用于所有子目录,F是完全控制,/T是递归生效 - 重启 Apache:在 XAMPP Control Panel 中先 Stop 再 Start(重载配置不生效)
Linux/macOS 下 chown + chmod 700 是硬性要求
PHP 官方文档明确要求:upload_tmp_dir 目录不能被组或其他用户写入,否则会直接拒绝上传。设成 777 不仅无效,还会触发 PHP 的安全拦截。
- 确认 Apache 用户:
ps aux | grep httpd或ps aux | grep apache,看 USER 列(常见为daemon) - 修改
php.ini:upload_tmp_dir = "/opt/lampp/temp"(务必用绝对路径) - 赋权:
sudo chown daemon:daemon /opt/lampp/temp && sudo chmod 700 /opt/lampp/temp - 验证是否生效:
php -i | grep upload_tmp_dir看输出是否为你设的路径
别忽略 session.save_path 和 upload_tmp_dir 共享同一目录的风险
很多教程只改 upload_tmp_dir,却忘了 session.save_path 默认也指向 /tmp 或同级目录。一旦这个目录权限不对,session 启动失败、验证码出不来、登录态丢失,问题表象和上传失败完全无关,排查时容易走偏。
建议统一指向一个可控目录,并同步赋权:
- 在
php.ini中同时设置:upload_tmp_dir = "D:\xampp\tmp"和session.save_path = "D:\xampp\tmp"(Windows) - 或 Linux 下:
upload_tmp_dir = "/opt/lampp/temp"和session.save_path = "/opt/lampp/temp" - 然后对这个目录执行完整权限配置(
icacls或chown+chmod)
最常被跳过的一步是:改完配置后没用管理员权限运行命令,或重启服务时只点了 Reload 而非 Stop/Start —— 这两个动作在 XAMPP 里效果完全不同。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











