根本原因是父目录不存在且未启用递归创建,需将mkdir第三参数设为true;应使用is_dir()而非file_exists()判断目录;注意路径编码、空格及权限安全设置。

这个报错根本原因不是权限不对,也不是路径写错了,而是父目录根本不存在,而你又没让 mkdir 递归创建。
必须开启递归参数 true
mkdir 默认只创建最后一级目录。比如你要建 upload/2026/11/02/,但 upload 目录都还没建,就会直接报 “No such file or directory”。
解决方法很简单:第三个参数设为 true。
-
mkdir('upload/2026/11/02/', 0755, true)—— 会自动逐级创建 upload → 2026 → 11 → 02 - 不加 true 或写成 false,只要中间任何一级缺失,就必然失败
别用 file_exists() 判断目录是否存在
file_exists() 对文件和目录都返回 true,容易误判。万一路径下碰巧有个同名文件,mkdir 就会跳过创建,后续操作可能出错。
- 改用
is_dir()明确判断是否为目录 - 示例:
if (!is_dir($path)) { mkdir($path, 0755, true); }
注意路径末尾的斜杠和编码问题
路径结尾带不带 / 一般不影响 mkdir,但要注意两点:
- Windows 下中文路径可能触发
Invalid argument,优先用mb_convert_encoding($path, 'UTF-8', 'UTF-8')确保编码一致 - 避免拼接时多出空格或不可见字符,可用
trim()清理 - 线上环境慎用
__DIR__拼路径,符号链接或部署变动可能导致实际路径偏移
权限设置别盲目用 0777
0777 虽然方便,但存在安全风险,尤其在共享主机或生产环境。
- 常规目录推荐
0755(所有者可读写执行,组和其他人仅读+执行) - 如果系统 umask 影响了实际权限,可创建后再用
chmod()补调 - 确保上级目录对 Web 进程有写权限,否则即使开了 recursive 也创建不了
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











