PHP条件式文件夹创建与文件上传的错误处理问题
问题解决与代码优化建议
1. 解决"无论是否有错误都创建文件夹"的问题
核心原因是文件夹创建逻辑未放在错误检查分支内,导致验证前就执行了创建操作。
修改步骤:
- 先完成所有表单字段、文件的验证,把错误统一收集到
$errors数组 - 仅当
empty($errors)为真时,再执行文件夹创建和文件上传
示例修改(create-resource.php):
<?php // 初始化错误数组 $errors = []; // 1. 表单字段验证 if (empty($_POST['resource_name'])) { $errors[] = '资源名称不能为空'; } // 2. 文件验证 if (!isset($_FILES['resource_file']) || $_FILES['resource_file']['error'] !== UPLOAD_ERR_OK) { $errors[] = '请选择有效的上传文件'; } else { $allowedMimeTypes = [ 'application/java-archive', 'image/jpeg', 'image/png', 'image/gif' ]; if (!in_array($_FILES['resource_file']['type'], $allowedMimeTypes)) { $errors[] = '仅支持上传.jar文件及JPG/PNG/GIF图片'; } } // 3. 无错误时才执行创建与上传 if (empty($errors)) { $folderName = sanitizeFileName($_POST['resource_name']); $folderPath = 'resources/' . $folderName; // 创建文件夹 if (createFolder($folderPath)) { // 上传文件 if (uploadFile($_FILES['resource_file'], $folderPath)) { echo '资源创建与上传成功'; } else { $errors[] = '文件上传失败'; // 可选:上传失败时删除空文件夹 rmdir($folderPath); } } else { $errors[] = '文件夹创建失败'; } } // 输出错误信息 if (!empty($errors)) { foreach ($errors as $error) { echo '<p>错误:' . $error . '</p>'; } } ?>
2. 解决"图片上传提示文件夹不存在"的问题
大概率是上传函数路径拼接错误,或创建文件夹时未递归生成父目录、权限不足。
修改create-resource-functions.php的关键函数:
优化文件夹创建函数
确保递归创建父目录,并设置合理权限:
function createFolder($folderPath) { // 路径已存在则直接返回成功 if (is_dir($folderPath)) { return true; } // 递归创建文件夹,权限设为0755(所有者可读可写可执行,其他可读可执行) return mkdir($folderPath, 0755, true); }
优化文件上传函数
确保目标路径正确拼接,且先验证文件夹存在:
function uploadFile($file, $targetFolder) { // 先验证目标文件夹是否存在 if (!is_dir($targetFolder)) { return false; } // 清理文件名,避免特殊字符问题 $fileName = sanitizeFileName($file['name']); // 拼接完整目标路径(确保路径末尾有斜杠) $targetPath = rtrim($targetFolder, '/') . '/' . $fileName; // 移动临时文件到目标路径 return move_uploaded_file($file['tmp_name'], $targetPath); } // 完善文件名清理函数 function sanitizeFileName($name) { // 替换特殊字符为下划线 $name = preg_replace('/[^a-zA-Z0-9_\-\.]/', '_', $name); // 避免文件名以点开头 return ltrim($name, '.'); }
额外优化建议
- 增加文件大小验证,避免超大文件上传
- 对图片使用
getimagesize二次验证,确保是真实图片文件 - 强化文件夹/文件名的清理逻辑,防止路径遍历攻击
- 错误信息尽量具体,方便问题排查
内容的提问来源于stack exchange,提问作者krzheski
相关产品推荐
相关产品推荐

