rikudou / mime-type-detector
使用魔数检测MIME类型
Requires
- php: ^7.2
- symfony/filesystem: ^4
- symfony/yaml: ^4
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.15
- phpstan/phpstan: ^0.11.16
Suggests
- ext-zip: Allows detecting of zip based types like apk, jar and others
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
这可能有点慢,因为所有定义都会被检查,即使是像apk
和jar
这样的定义,需要检查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
- Androidapk
文件application/java-archive
- Javajar
存档application/x-xpinstall
- Mozillaxpi
文件application/epub+zip
-epub
书籍application/x-itunes-ipa
- iOSipa
文件(这些检测类型特别资源密集)application/vnd.google-earth.kmz
- Google Earthkmz
文件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', ]);
上面的两个配置意味着相同的意思。