mkdir()函数报错:用户首次上传正常二次上传提示文件已存在
解决mkdir()重复执行报错的问题
你的问题核心出在条件判断的逻辑错误上,导致每次上传都会尝试创建已存在的目录,触发警告后还中断了数据库写入流程。咱们一步步拆解修复:
问题根源分析
先看你写的条件代码:
if(!file_exists($folder) && is_dir($folder)) { $path = mkdir("$folder/images", 0777, true); }
这个逻辑完全矛盾:
!file_exists($folder)表示「$folder路径不存在」is_dir($folder)表示「$folder是一个目录」
这两个条件不可能同时成立,所以这个if语句永远不会生效。也就是说,你每次上传都会执行mkdir("$folder/images", 0777, true)——第一次执行时目录不存在,创建成功;第二次执行时目录已存在,自然抛出「mkdir(): File exists」警告,而这个警告可能中断了后续的数据库写入操作。
修复后的代码
我们需要调整条件,直接检查要创建的目标目录($folder/images)是否存在,仅当它不存在时才执行创建:
$folder = "users/$aid/projects/$prname/"; // 明确要创建的目标目录路径 $targetDir = "$folder/images"; // 检查目标目录是否不存在,或者存在但不是目录(避免和重名文件冲突) if (!file_exists($targetDir) || !is_dir($targetDir)) { // 递归创建目录(true参数会自动创建不存在的父目录) $path = mkdir($targetDir, 0777, true); // 可选:添加创建失败的处理逻辑 if (!$path) { error_log("无法创建目录: $targetDir"); // 这里可以添加友好的用户提示,或者终止脚本 // die("上传失败,无法创建存储目录"); } }
额外优化建议
- 权限调整:
0777权限过大,存在安全风险,建议根据服务器环境改为更严格的权限(比如0755),避免恶意用户篡改目录内容。 - 错误处理:尽量避免用
@抑制警告,主动判断目录状态是更可靠的方式;如果需要捕获错误,可以使用异常处理包裹目录创建逻辑。 - 流程隔离:把目录创建和数据库写入的逻辑解耦,确保目录操作的异常不会直接中断数据库流程。
内容的提问来源于stack exchange,提问作者Nagendra Kumar
相关产品推荐
相关产品推荐

