多图片数组上传时宽高验证异常问题求助
图片上传尺寸验证修复方案
你的代码主要有三个问题导致尺寸超标的图片仍被保存:
- 循环嵌套逻辑混乱,每次处理单张图片时都遍历所有上传文件,导致尺寸变量无法对应当前图片
- 条件判断顺序错误,先执行了文件保存操作,之后才判断尺寸,错误已经无法挽回
- 变量被重复赋值覆盖,
$photo_temp先存临时路径数组,后来又被改成关联数组存尺寸信息,导致后续取临时路径出错
下面是修复后的完整代码,同时优化了逻辑流程:
$valid = 1; $error_message = ''; $upload_dir = "../assets/uploads/product_photos/"; $m = 0; $z = 0; $final_name1 = []; // 遍历所有上传的图片文件 foreach ($_FILES['photo']['tmp_name'] as $key => $single_file) { // 跳过空文件 if (empty($single_file)) continue; // 获取当前图片的尺寸 $image_size = getimagesize($single_file); $width = $image_size[0]; $height = $image_size[1]; // 获取文件扩展名 $filename = $_FILES['photo']['name'][$key]; $my_ext1 = pathinfo($filename, PATHINFO_EXTENSION); $my_ext1 = strtolower($my_ext1); // 统一转小写,避免大小写问题 // 先验证尺寸 if ($width > 300 || $height > 200) { $valid = 0; $error_message .= "图片 {$filename} 尺寸超出限制,需在300×200以内<br>"; continue; // 跳过当前文件的后续处理 } // 再验证扩展名 if (!in_array($my_ext1, ['jpg', 'png', 'jpeg', 'gif'])) { $valid = 0; $error_message .= "图片 {$filename} 格式不正确,仅支持jpg/png/jpeg/gif<br>"; continue; } // 验证通过,保存文件 $final_name = $z . '.' . $my_ext1; $final_path = $upload_dir . $final_name; if (move_uploaded_file($single_file, $final_path)) { $final_name1[$m] = $final_name; $m++; $z++; } else { $valid = 0; $error_message .= "图片 {$filename} 保存失败<br>"; } } // 最后处理结果提示 if (!$valid) { // 这里可以输出错误信息到页面,对应目标UI效果 echo $error_message; } else { echo "所有图片上传成功"; }
关键改动说明
- 直接遍历
$_FILES['photo']数组,确保每张图片的尺寸、扩展名、保存操作一一对应 - 调整验证顺序:先验证尺寸,再验证格式,只有所有验证通过才执行文件保存
- 增加了文件保存失败的错误处理,同时给错误提示加上文件名,方便用户定位问题
- 统一变量命名,避免重复赋值导致的逻辑混乱
内容的提问来源于stack exchange,提问作者Worthless Me
相关产品推荐
相关产品推荐

