PHP图片上传脚本异常:触发错误提示后仍完成上传求助
问题分析与解决建议
嘿,这个问题我之前也碰到过!核心原因很简单:你虽然收集了错误信息,但没在发现错误的时候停下来终止上传流程——错误提示能出来说明$errors确实被填充了,但代码还是自顾自执行了后面的上传操作。
下面是具体的修复步骤和优化建议:
1. 在校验后判断错误,中断上传流程
收集完所有校验规则的错误后,先检查$errors数组是否为空。如果不为空,直接跳过后续的上传逻辑,只展示错误提示就行。
举个代码示例,你可以这样调整:
$message = ""; $errors = array(); if (isset($_POST['uploadImg'])) { // 1. 先执行所有校验逻辑:格式检查、大小检查等 // 比如格式校验 $allowed_ext = array('jpg', 'jpeg', 'png', 'webp'); $file_ext = strtolower(pathinfo($_FILES['img']['name'], PATHINFO_EXTENSION)); if (!in_array($file_ext, $allowed_ext)) { $errors[] = "仅支持JPG、PNG、WebP格式图片,不支持GIF!"; } // 比如大小校验 $max_size = 2 * 1024 * 1024; // 2MB if ($_FILES['img']['size'] > $max_size) { $errors[] = "图片大小不能超过2MB!"; } // 其他校验规则... // 2. 关键步骤:检查是否有错误,有错误就跳过上传 if (!empty($errors)) { $message = implode('<br>', $errors); // 如果是在独立的处理脚本里,也可以用exit直接终止后续执行 // exit($message); } else { // 3. 没有错误才执行真正的上传操作 $target_dir = "uploads/"; $target_path = $target_dir . uniqid() . "." . $file_ext; if (move_uploaded_file($_FILES['img']['tmp_name'], $target_path)) { $message = "图片上传成功!"; } else { $message = "上传失败,请重试。"; } } }
2. 确保校验在上传前执行
要注意:所有校验逻辑必须放在move_uploaded_file()之前!如果你的代码是先把文件移到服务器目录,再做格式/大小检查,那就算发现错误,文件已经留在服务器上了,看起来就像“错误提示出来但图片还是上传了”。
3. 额外的优化建议
- 不要只依赖扩展名校验:可以用
finfo函数检查文件真实的MIME类型,防止恶意文件改扩展名绕过校验:$finfo = new Finfo(FILEINFO_MIME_TYPE); $mime_type = $finfo->file($_FILES['img']['tmp_name']); $allowed_mimes = array('image/jpeg', 'image/png', 'image/webp'); if (!in_array($mime_type, $allowed_mimes)) { $errors[] = "仅支持JPG、PNG、WebP格式图片!"; } - 优先检查PHP内置的上传错误:可以先判断
$_FILES['img']['error'],比如文件超过php.ini或表单设置的大小限制时,会返回UPLOAD_ERR_INI_SIZE或UPLOAD_ERR_FORM_SIZE,这比自己检查文件大小更可靠:if ($_FILES['img']['error'] !== UPLOAD_ERR_OK) { switch ($_FILES['img']['error']) { case UPLOAD_ERR_INI_SIZE: $errors[] = "图片超过服务器允许的最大大小!"; break; case UPLOAD_ERR_FORM_SIZE: $errors[] = "图片超过表单允许的最大大小!"; break; // 其他错误类型可以按需处理 } }
内容的提问来源于stack exchange,提问作者RubadubDub
相关产品推荐
相关产品推荐

