<?php
class FileTypeValidator {
/**
* 验证文件类型基于文件头
*
* @param string $filePath 文件路径
* @param string|array $allowedTypes 允许的文件类型,支持MIME类型或文件扩展名数组
* @return bool|string 如果验证通过返回true,否则返回错误信息
*/
public function validateFileType($filePath, $allowedTypes) {
if (!file_exists($filePath)) {
return "文件不存在";
}
// 获取文件MIME类型
$finfo = finfo_open(FILEINFO_MIME_TYPE); // 返回 mime 类型
$mimeType = finfo_file($finfo, $filePath);
finfo_close($finfo);
// 将允许的类型转换为MIME类型数组(如果传入的是扩展名)
if (is_array($allowedTypes)) {
$allowedMimeTypes = [];
foreach ($allowedTypes as $type) {
if (strpos($type, '.') === 0) { // 假设以'.'开头的是文件扩展名
$extension = substr($type, 1);
// 这里只是简单示例,实际中需要根据扩展名映射到MIME类型
// 示例:'.jpg' => 'image/jpeg'
$allowedMimeTypes[] = 'image/jpeg'; // 假设所有扩展名都映射为image/jpeg
} else {
$allowedMimeTypes[] = $type;
}
}
$allowedTypes = $allowedMimeTypes;
}
// 验证MIME类型
if (in_array($mimeType, $allowedTypes)) {
return true;
} else {
return "文件类型不被允许: {$mimeType}";
}
}
}
// 使用示例
$fileTypeValidator = new FileTypeValidator();
$result = $fileTypeValidator->validateFileType('path/to/your/file.jpg', ['image/jpeg', 'image/png']);
if ($result === true) {
echo "文件类型验证通过";
} else {
echo "文件类型验证失败: " . $result;
}
?>
注意:
- 上述代码中,文件扩展名到MIME类型的映射是非常简化的示例,实际使用中你需要根据文件扩展名查找正确的MIME类型,或者使用更复杂的库来处理。
- `finfo_open` 和 `finfo_file` 是PHP中用于获取文件信息的函数,这里用于获取文件的MIME类型。
- 如果`$allowedTypes`是文件扩展名的数组,代码示例中简单地将它们全部映射为`image/jpeg`作为示例,实际使用时你需要根据扩展名找到正确的MIME类型。
- 代码中添加了基本的错误处理,如文件不存在的情况。