PHP 基于文件头的文件类型验证类函数



<?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类型。

- 代码中添加了基本的错误处理,如文件不存在的情况。