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

PHP上传异常:非允许类型文件仍被上传,求问题排查

嘿,我来帮你捋清楚这个问题~

你猜得完全没错!核心问题就是你没有在执行move_uploaded_file()之前判断错误是否存在。目前你的代码逻辑大概是:检测到文件类型错误→添加错误提示→但不管有没有错误,都会继续执行文件上传操作,这就导致了“提示错误但文件依然被上传”的矛盾情况。

具体修正步骤

  1. 添加错误校验逻辑:在调用move_uploaded_file()之前,必须检查$error数组是否为空(也就是count($error) == 0)。只有当没有任何错误时,才执行文件移动操作。
  2. 补充安全校验(可选但强烈建议):仅靠$_FILES['upload']['type']判断文件类型并不安全,因为这个值可以被客户端篡改。建议结合文件扩展名和getimagesize()函数,确保上传的是真实图片。

修正后的代码示例

<?php
$fajl_types = ['image/jpeg', 'image/png', 'image/gif'];
$allowed_extensions = ['jpg', 'jpeg', 'png', 'gif'];
$error = [];

// 1. 校验文件MIME类型
if (!in_array($_FILES['upload']['type'], $fajl_types)) {
    $error[] = "不正确的文件类型";
}

// 2. 校验文件扩展名(防篡改)
$file_ext = strtolower(pathinfo($_FILES['upload']['name'], PATHINFO_EXTENSION));
if (!in_array($file_ext, $allowed_extensions)) {
    $error[] = "不允许的文件扩展名";
}

// 3. 校验是否为真实图片(避免伪装成图片的恶意文件)
$image_info = getimagesize($_FILES['upload']['tmp_name']);
if (!$image_info) {
    $error[] = "上传的不是有效图片文件";
}

// 4. 无错误时才执行上传
if (count($error) == 0) {
    $upload_path = 'uploads/' . $_FILES['upload']['name'];
    if (move_uploaded_file($_FILES['upload']['tmp_name'], $upload_path)) {
        echo "文件上传成功!";
    } else {
        $error[] = "文件移动失败,请检查上传目录权限";
    }
}

// 5. 输出错误信息
if (!empty($error)) {
    foreach ($error as $err_msg) {
        echo $err_msg . "<br>";
    }
}
?>

额外注意事项

  • 确保你的uploads目录有写入权限(通常设置为755或775);
  • 可以添加文件大小限制,避免超大文件上传;
  • 最好对上传后的文件重命名,防止文件名重复或包含恶意字符。

内容的提问来源于stack exchange,提问作者KissTom87

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:49:47