rikudou/mime-type-detector

使用魔数检测MIME类型

dev-master 2019-09-27 16:46 UTC

This package is auto-updated.

Last update: 2024-08-28 04:21:31 UTC


README

使用魔数(即魔数字节)来检测内容媒体类型。

安装

composer require rikudou/mime-type-detector

使用

简单地构造一个新对象并调用getMimeType()方法

<?php

use Rikudou\MimeTypeDetector\MimeTypeDetector;

$mimeTypeDetector = new MimeTypeDetector();
var_dump($mimeTypeDetector->getMimeType('/path/to/file.jpeg'));
// will print image/jpeg

这可能有点慢,因为所有定义都会被检查,即使是像apkjar这样的定义,需要检查zip存档以确定内容类型。

如果您不需要检查这些,您可以禁用存档查看(见下文的高级使用)。

高级使用

自定义定义

您可以将自定义MIME类型定义作为第二个参数提供

<?php

use Rikudou\MimeTypeDetector\MimeTypeDetector;

/** @var array $myDefinitions */

$detector = new MimeTypeDetector(null, $myDefinitions);

定义格式在ConfigNormalizerInterface中描述,基本上是这样的

[
'mime_types' => [
    'mimeType' => [
        0 => [
            'length' => 1,
            'offset' => 0,
            'binary' => null,
            'archive' => false,
            'parent' => null,
            'files' => [
                0 => [
                    'name' => 'path/to/file/in/archive'
                    'dir' => false,
                    'pattern' => false,
                    'binary' => null,
                    'content' => null
                ]
            ],
            'bytes' => [
                0 => 'ff',
            ]
        ]
    ]
]

属性列表

  • mime_types - 这是根数组键,必须存在。
  • mediaType - 这是媒体/ MIME类型,例如image/jpeg,它也是数组定义的键。值可以是定义数组或定义本身。
  • parent - 父定义,父的所有属性将与子定义合并。以下所有指定为必需的属性,如果父有设置,则不是必需的。Null表示没有父。父必须存在,并且可以(并且应该)在子之后定义。
  • length 必需 - 从文件中获取的字节长度。
  • offset - 它是从文件开始的字节数。
  • bytes 必需 - 应在给定偏移量和给定长度处的字节。可以是字符串或字符串数组。字节在关系中进行检查,例如,如果任何一个匹配,则匹配。可以包含*和?,分别表示任何字符和任何单个字符(shell模式)。
  • binary - 文件是否应该是二进制的。可以是null,表示不检查。
  • archive - 文件是否是存档,这意味着存档内的文件应该检查存在/内容等。
  • files 必需如果存档为true - 应检查的存档内文件的数组。可以是字符串或值数组
    • name - 应在存档中存在的文件名
    • dir - 如果name是目录的路径而不是文件,设置为true。必须提取存档才能使用,所以请谨慎使用
    • pattern - 如果名称包含shell模式(*?),设置为true。必须提取存档才能使用,所以请谨慎使用
    • binary - name中的文件是否应该是二进制的。Null表示不检查
    • content - 如果不为null,检查文件内容是否等于给定的字符串

关闭存档遍历

由于存档遍历可能有点慢,您可以禁用它,如果您不需要这些类型

  • application/vnd.android.package-archive - Android apk文件
  • application/java-archive - Java jar存档
  • application/x-xpinstall - Mozilla xpi文件
  • application/epub+zip - epub书籍
  • application/x-itunes-ipa - iOS ipa文件(这些检测类型特别资源密集)
  • application/vnd.google-earth.kmz - Google Earth kmz 文件
  • application/vnd.openxmlformats-officedocument.wordprocessingml.document - Microsoft Word 文件
  • application/vnd.openxmlformats-officedocument.spreadsheetml.sheet - Microsoft Excel 文件
  • application/vnd.oasis.opendocument.presentation - OpenDocument 演示文件
  • application/vnd.oasis.opendocument.spreadsheet - OpenDocument 工作表文件
  • application/vnd.oasis.opendocument.text - OpenDocument 文档文件
  • application/vnd.openxmlformats-officedocument.presentationml.presentation - Microsoft PowerPoint 文件

所有这些都将报告为 application/zip

要关闭这些功能,只需设置一个自定义的 ConfigNormalizer,将 $advancedDetection 设置为 false

<?php

use Rikudou\MimeTypeDetector\Config\ConfigNormalizer;
use Rikudou\MimeTypeDetector\MimeTypeDetector;

$config = new ConfigNormalizer(false);
$detector = new MimeTypeDetector($config);

关闭单个 MIME 类型

如果您不想检查某些 MIME 类型(例如,因为您需要检测例如 apk 文件,但不想为所有其他基于 zip 的文件承担资源惩罚),您可以使用自定义 ConfigNormalizer 来关闭它们

<?php

use Rikudou\MimeTypeDetector\Config\ConfigNormalizer;
use Rikudou\MimeTypeDetector\MimeTypeDetector;

$config = new ConfigNormalizer(true, [
    'application/x-itunes-ipa'
]); // this will check all types but ipa files
$detector = new MimeTypeDetector($config);

$config = new ConfigNormalizer(false, [
    'image/jpeg'
]); // this won't check any zip-based types and jpeg files

所有类型及其检测的列表在 mime.yaml 中。

使用配置构建器创建配置

配置构建器旨在帮助您创建 MIME 类型的配置,并开启和关闭类型组的检测

<?php

use Rikudou\MimeTypeDetector\Config\ConfigBuilder;

$config = ConfigBuilder::create()
    ->withoutZipBased()
    ->withOffice()
    ->withoutExpensive()
    ->withImages()
    ->withAudio()
    ->withVideo()
    ->withArchives()
    ->withOther()
    ->build();

默认情况下,当您只调用 ConfigBuilder::create() 时,所有内容都处于启用状态,因此您不需要调用例如 withImages(),如上面的示例所示。但如果您想禁用图像检测,可以使用 withoutImages() - 每个带有 with 方法的 without 都有对应的方法。

还有一个静态方法 createSaneDefaults() 可用。

<?php

use Rikudou\MimeTypeDetector\Config\ConfigBuilder;

$config1 = ConfigBuilder::createSaneDefaults()
    ->build();

$config2 = ConfigBuilder::create()
    ->withoutZipBased()
    ->withOffice()
    ->withoutExpensive()
    ->with([
        'application/vnd.android.package-archive',
        'application/java-archive',
        'application/epub+zip',
    ]);

上面的两个配置意味着相同的意思。