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

PHP循环中多张图片宽高校验功能失效问题排查

问题原因

  • 核心错误:你在调用getimagesize()做宽高校验时,传入的是最终要保存的目标路径,此时上传的文件还存放在PHP临时目录中,目标路径下还没有对应文件,因此getimagesize()读取失败,返回的宽高都是无效值,导致校验逻辑永远触发错误。
  • 次要问题1:你已经先用array_filter()过滤了空上传项统计出$totalfiles,后续又重新赋值为未过滤的count($_FILES['banner']['name']),如果存在空上传项会导致统计出错。
  • 次要问题2:宽高判断逻辑冗余,且你错误提示中标注要求尺寸是1080×1920,但代码中设置的maxWidth=1920、maxHeight=1080,如果需求是竖版尺寸,这里宽高值写反了。
  • 次要问题3:你生成了带唯一ID的新文件名$target_path,但实际移动文件时用的是原始文件名$bannerpath,容易出现重名覆盖的问题。

修正后代码

<?php 
$tf = array_filter($_FILES['banner']['name']);
$totalfiles = count($tf);
$final = $totalfiles + $oldimgcount;
if ($final > 5) {
    $this->session->set_flashdata('limit', "最多允许上传5张图片");
    redirect('upload_controller/edit_store/' . $id, 'refresh');
} else {
    if (isset($_FILES['banner']['name']) && $totalfiles != 0) {
        // 保留过滤后的统计结果,不要重新赋值
        $files = array();
        $paths = 'assets/store_banner/';
        // 确认宽高需求:如果要1080宽1920高就交换下面两个值
        $maxWidth = 1920;
        $maxHeight = 1080;
        $validextensions = array("gif", "jpeg", "jpg", "png");
        
        for ($i = 0; $i < $totalfiles; $i++) {
            // 跳过空上传项
            if (empty($_FILES['banner']['name'][$i])) continue;
            
            $ext = explode('.', basename($_FILES['banner']['name'][$i]));
            $file_extension = strtolower(end($ext));
            // 校验扩展名
            if (!in_array($file_extension, $validextensions)) {
                $this->session->set_flashdata('ExtError', "仅允许上传gif、jpeg、jpg、png格式的图片");
                redirect('upload_controller/edit_store/' . $id, 'refresh');
            }
            
            // 核心修改:读取临时文件做宽高校验
            list($width, $height) = getimagesize($_FILES['banner']['tmp_name'][$i]);
            if (!$width || !$height) {
                $this->session->set_flashdata('SizeError', "上传的文件不是有效的图片");
                redirect('upload_controller/edit_store/' . $id, 'refresh');
            }
            // 合并宽高判断逻辑
            if ($width != $maxWidth || $height != $maxHeight) {
                $this->session->set_flashdata('SizeError', "您上传的图片尺寸不符合要求,必须为{$maxWidth}×{$maxHeight}像素");
                redirect('upload_controller/edit_store/' . $id, 'refresh');
            }
            
            // 生成唯一文件名,避免重名
            $new_filename = md5(uniqid()) . "." . $file_extension;
            $bannerpath = $paths . $new_filename;
            if (move_uploaded_file($_FILES['banner']['tmp_name'][$i], $bannerpath)) {
                $files[] = $bannerpath;
            } else {
                $this->session->set_flashdata('error', "上传失败,请稍后重试");
                redirect('upload_controller/edit_store/' . $id, 'refresh');
            }
        }
    }
}
?>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:12:02