如何在PHP中结合finfo验证文件大小与尺寸
完善PHP文件上传的大小与尺寸验证
我来帮你给现有的文件上传功能添加上传大小限制和指定图片尺寸的验证,咱们直接修改代码并解释关键部分:
1. 完整修改后的upload-manager.php代码
<?php if($_SERVER["REQUEST_METHOD"] == "POST"){ // 配置验证规则 $max_file_size = 5 * 1024 * 1024; // 5MB,单位字节 $required_width = 750; $required_height = 250; $whitelist_type = array('image/jpeg', 'image/png','image/gif'); $error = []; $file = $_FILES['photo']; // 1. 验证文件类型 $finfo = new finfo(FILEINFO_MIME_TYPE); $fileContents = file_get_contents($file['tmp_name']); $mimeType = $finfo->buffer($fileContents); if (!in_array($mimeType, $whitelist_type)) { $error[] = '仅允许上传 .jpg, .jpeg, .gif, .png 格式的图片'; } // 2. 验证文件大小 if ($file['size'] > $max_file_size) { $error[] = '文件大小不能超过 5 MB'; } // 3. 验证图片尺寸 if (empty($error)) { // 只有文件类型合法时才检查尺寸,避免非图片文件报错 $image_info = getimagesize($file['tmp_name']); $image_width = $image_info[0]; $image_height = $image_info[1]; if ($image_width != $required_width || $image_height != $required_height) { $error[] = "图片尺寸必须为 {$required_width}*{$required_height} 像素,当前尺寸为 {$image_width}*{$image_height}"; } } // 处理验证结果 if (empty($error)) { // 这里可以添加文件保存的逻辑,比如 move_uploaded_file() echo '文件上传验证通过!'; } else { // 输出所有错误信息 foreach ($error as $err) { echo "<p style='color:red;'>{$err}</p>"; } } } ?>
关键验证点解释
- 文件大小验证:通过
$_FILES['photo']['size']获取文件的字节大小,和我们定义的$max_file_size(5MB)对比,超过则添加错误信息。 - 图片尺寸验证:使用
getimagesize()函数获取图片的宽高信息,这个函数会返回一个数组,索引0是宽度,索引1是高度。注意要先确保文件是合法的图片类型再调用这个函数,避免对非图片文件调用导致的错误。 - 错误处理优化:把所有错误收集到数组中,最后统一输出,用户能看到所有不符合要求的地方,体验更好。
额外注意事项
- 别忘了在服务器的
php.ini中检查upload_max_filesize和post_max_size配置,确保它们的值不小于你设置的5MB,否则PHP会在上传阶段就拦截大文件,你的代码根本接收不到。 - 如果需要更严谨的验证,可以考虑在前端也添加大小和尺寸的初步验证(比如用JavaScript),但后端验证是必须的,因为前端验证可以被绕过。
内容的提问来源于stack exchange,提问作者user5443928
相关产品推荐
相关产品推荐

