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

PHP文件上传:大写扩展名无法通过验证的解决方法求助

修复PHP文件上传扩展名大小写验证问题

这个问题的核心是大小写不匹配:你的$allowed数组里的键都是小写扩展名,但pathinfo()返回的扩展名会保留原文件名里的大小写(比如上传image.JPG时,$ext会是JPG),自然找不到对应的数组键,导致验证失败。

最简单的修复方法是把获取到的扩展名统一转为小写,这样不管用户上传的是大写还是小写扩展名,都能和$allowed数组里的键匹配:

// 检查表单是否提交
if($_SERVER["REQUEST_METHOD"] == "POST"){
    // 检查文件是否无错误上传
    if(isset($_FILES["photo"]) && $_FILES["photo"]["error"] == 0){
        $allowed = array("jpg" => "image/jpg", "jpeg" => "image/jpeg", "gif" => "image/gif", "png" => "image/png");
        $filename = $_FILES["photo"]["name"];
        $filetype = $_FILES["photo"]["type"];
        $filesize = $_FILES["photo"]["size"];
        // 验证文件扩展名:将获取到的扩展名转为小写
        $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
        if(!array_key_exists($ext, $allowed)) die("Error: Choose between .jpg, .jpeg, .gif, .png. Your format is: $ext");
        // 后续的上传处理逻辑...
    }
}

为什么这样有效?

当用户上传image.JPG时,strtolower()会把JPG转为jpg,此时用array_key_exists($ext, $allowed)就能正确匹配到$allowed数组里的"jpg"键,验证通过。

额外的安全建议

  • 不要只依赖扩展名验证:可以结合finfo()函数检查文件的实际MIME类型,防止用户伪造扩展名上传恶意文件。
  • 限制文件大小:你已经获取了$filesize,可以添加大小限制(比如不超过2MB),避免过大的文件占用服务器资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 07:07:49