本文目录导读:

在PHP中限制上传文件类型有多种方法,以下是几种常用的实现方式:
使用文件扩展名验证(基础方法)
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$allowed_extensions = ['jpg', 'jpeg', 'png', 'gif'];
$file_extension = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
if (!in_array($file_extension, $allowed_extensions)) {
die('文件类型不允许上传');
}
// 上传文件
move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $_FILES['file']['name']);
}
?>
使用MIME类型验证(更安全)
<?php
$allowed_mime_types = [
'image/jpeg',
'image/png',
'image/gif',
'application/pdf'
];
// 检查文件MIME类型
$file_mime = mime_content_type($_FILES['file']['tmp_name']);
$uploaded_mime = $_FILES['file']['type'];
if (!in_array($file_mime, $allowed_mime_types)) {
die('文件MIME类型不允许');
}
?>
图片文件额外验证(最可靠)
<?php
$allowed_mime_types = ['image/jpeg', 'image/png', 'image/gif'];
$file_mime = mime_content_type($_FILES['file']['tmp_name']);
// 检查是否为真实图片
$image_info = getimagesize($_FILES['file']['tmp_name']);
if ($image_info === false) {
die('文件不是有效的图片');
}
if (!in_array($image_info['mime'], $allowed_mime_types)) {
die('图片类型不允许');
}
?>
完整的文件上传类
<?php
class FileUploader {
private $allowed_extensions;
private $allowed_mime_types;
private $max_size;
public function __construct() {
$this->allowed_extensions = ['jpg', 'jpeg', 'png', 'gif'];
$this->allowed_mime_types = ['image/jpeg', 'image/png', 'image/gif'];
$this->max_size = 5 * 1024 * 1024; // 5MB
}
public function upload($file, $upload_dir) {
// 检查上传错误
if ($file['error'] !== UPLOAD_ERR_OK) {
return ['success' => false, 'message' => '上传错误'];
}
// 检查文件大小
if ($file['size'] > $this->max_size) {
return ['success' => false, 'message' => '文件过大'];
}
// 检查扩展名
$extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
if (!in_array($extension, $this->allowed_extensions)) {
return ['success' => false, 'message' => '文件类型不允许'];
}
// 检查MIME类型(使用mime_content_type更可靠)
$mime = mime_content_type($file['tmp_name']);
if (!in_array($mime, $this->allowed_mime_types)) {
return ['success' => false, 'message' => 'MIME类型不允许'];
}
// 生成唯一文件名
$newname = uniqid() . '.' . $extension;
// 移动文件
if (!move_uploaded_file($file['tmp_name'], $upload_dir . '/' . $newname)) {
return ['success' => false, 'message' => '文件保存失败'];
}
return ['success' => true, 'filename' => $newname];
}
}
// 使用示例
$uploader = new FileUploader();
$result = $uploader->upload($_FILES['file'], 'uploads');
if ($result['success']) {
echo '上传成功!文件名:' . $result['filename'];
} else {
echo '上传失败:' . $result['message'];
}
?>
HTML表单示例
<form action="upload.php" method="post" enctype="multipart/form-data">
<!-- 添加客户端验证 -->
<input type="file" name="file" accept=".jpg,.jpeg,.png,.gif,image/jpeg,image/png,image/gif">
<input type="submit" value="上传">
</form>
重要安全提示
- 不要仅依赖客户端验证:客户端验证可以被绕过,必须在服务器端进行验证
- 不要信任
$_FILES['file']['type']:这个值可以由客户端伪造,应该使用mime_content_type()函数 - 对图片文件使用
getimagesize():额外验证是否为真实图片 - 重命名文件:使用唯一名称保存文件,避免路径穿越
- 限制文件大小:同时设置
upload_max_filesize和post_max_size - 存储目录权限:确保上传目录没有执行权限
配置文件设置(php.ini)
upload_max_filesize = 5M
post_max_size = 6M
max_file_uploads = 20
通过组合使用这些方法,可以有效限制上传文件类型,提高网站安全性。