PHP上传文件失败:move_uploaded_file触发找不到目录报错求助
问题根因
你的报错核心是move_uploaded_file找不到目标写入路径,属于PHP文件上传的常见问题。
解决步骤
- 修正相对路径错误
你当前执行的脚本在php/auth-functions.php目录下,代码里写的相对路径images/uploads/会被解析为php/images/uploads/,不是你预期的项目根目录下的images/uploads文件夹。建议直接用绝对路径避免解析偏差:
// 取当前脚本所在目录的上级目录,对应你的项目根目录 D:\PhpStorm\Projects\Gamesite $rootPath = dirname(__DIR__); $target_dir = $rootPath . "/images/uploads/"; $target_file = $target_dir . basename($_FILES['game-team-pic']['name']);
- 提前校验目录存在性和权限
如果目标目录不存在,PHP不会自动创建,需要你主动判断生成,同时确保目录有读写权限:
// 目录不存在就递归创建,权限设置为755(Windows环境可忽略权限参数,会自动适配) if (!file_exists($target_dir)) { mkdir($target_dir, 0755, true); }
- 调整代码执行逻辑
你当前的写法是先写入数据库再移动文件,一旦文件移动失败,数据库里就会存入无效的文件路径,建议调整顺序:
// 先判断上传是否正常 if ($_FILES['game-team-pic']['error'] !== UPLOAD_ERR_OK) { die("文件上传出错,错误码:" . $_FILES['game-team-pic']['error']); } // 移动成功再写入数据库 if (move_uploaded_file($_FILES['game-team-pic']['tmp_name'], $target_file)) { $stmt4->execute(); } else { die("文件保存失败,请检查目录权限"); }
额外优化建议
直接使用用户上传的原始文件名会导致同名文件覆盖,建议给文件名增加唯一前缀,比如:
$target_file = $target_dir . uniqid() . '-' . basename($_FILES['game-team-pic']['name']);
内容的提问来源于stack exchange,提问作者Maurits Van Beek
相关产品推荐
相关产品推荐

