必须修改 php.ini 的 upload_tmp_dir 并确保路径存在、为绝对路径、权限正确:Windows 下需用 icacls 授予 NT AUTHORITY\SYSTEM 完全控制权,且重启 Apache 后验证 $_FILES'file' 路径一致。

直接改 php.ini 里的 upload_tmp_dir 不够,必须同步解决权限和路径有效性问题,否则上传仍会静默失败。
确认当前生效的 upload_tmp_dir 路径
别猜,先看 PHP 实际用的是哪个路径:
- 创建一个
info.php文件,内容为<?php phpinfo(); ?>,浏览器访问它,在页面搜索upload_tmp_dir - 或命令行执行
php -i | grep upload_tmp_dir(注意:CLI 和 Web 请求可能加载不同配置,优先信 Web 环境结果) - 如果输出为空字符串,说明没显式配置,PHP 正在 fallback 到系统默认(如
C:\Windows\Temp或/tmp),这个路径在 XAMPP 下极大概率不可写
修改 php.ini 并确保路径存在且为绝对路径
XAMPP 的 php.ini 通常位于 C:\xampp\php\php.ini(Windows)或 /Applications/XAMPP/xamppfiles/etc/php.ini(macOS)。找到这一行:
;<code>upload_tmp_dir</code> = "C:\xampp\tmp"
取消注释,改为明确的绝对路径:
立即学习“PHP免费学习笔记(深入)”;
upload_tmp_dir</code> = "C:\xampp\tmp"
注意点:
- Windows 下反斜杠
\可以用,但推荐统一用正斜杠/避免转义问题:upload_tmp_dir = "C:/xampp/tmp" - 路径必须真实存在,XAMPP 不会自动创建该目录;若不存在,手动执行
mkdir C:\xampp\tmp - 不能用相对路径(如
./tmp)或环境变量(如%TEMP%),PHP 会直接忽略
Windows 下必须授予 NT AUTHORITY\SYSTEM 完全控制权
XAMPP 的 Apache 在 Windows 默认以 NT AUTHORITY\SYSTEM 身份运行,不是你当前登录用户。图形界面“属性 → 安全”里加权限往往无效,因为继承被禁或主体名写错。
正确做法是管理员身份打开命令提示符,执行:
<pre class="brush:php;toolbar:false;">icacls "C:\xampp\tmp" /grant "NT AUTHORITY\SYSTEM:(OI)(CI)F" /T
其中:
(OI) 表示对象继承,<code>(CI)表示容器继承,F是完全控制-
/T确保递归应用到子目录和文件 - 别用
Everyone或Users,不安全且常不起作用
执行后检查:右键目录 → 属性 → 安全 → 高级 → 查看“NT AUTHORITY\SYSTEM”是否在列表中,且“类型”为“允许”,“权限”含“完全控制”。
重启 Apache(不是重载)并验证
改完配置和权限后,必须彻底重启 Apache 才能生效:
- 用 XAMPP Control Panel,点击
Stop再点Start;只点Restart有时不重读php.ini - 验证方式:上传一个小文件,然后在 PHP 脚本中打印
$_FILES['file']['tmp_name'],确认路径前缀与upload_tmp_dir一致 - 常见失败现象:
move_uploaded_file(): Unable to move或Warning: Failed to write session data—— 这两类错误背后往往是同一个权限根因
最易被忽略的是:Windows 权限模型下,“目录存在”不等于“Apache 能写”,必须显式授权给 NT AUTHORITY\SYSTEM,且要用 icacls 命令保证继承标志正确。



















