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
相关产品推荐
相关产品推荐

