You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 22:36:37