使用 fileinfo 获取 mime 类型,是大文件的好方法吗?

Posted

技术标签:

【中文标题】使用 fileinfo 获取 mime 类型,是大文件的好方法吗?【英文标题】:Get mime type with fileinfo, is the good method for big file? 【发布时间】:2014-02-20 00:37:07 【问题描述】:

我会使用 fileinfo 来获取我的文件的 mime 类型,因为 mime_content_type 已被弃用。 但是我有一个问题,它是大文件的好方法吗?

如果我有一个 1.5gb 的文件,我不想在内存中“打开”这个文件以获取 mime 类型...

<?php
$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
foreach (glob("*") as $filename) 
    echo finfo_file($finfo, $filename) . "\n";

finfo_close($finfo);
?>

谢谢。

【问题讨论】:

【参考方案1】:

我想 finfo 从文件头获取 MIME 信息,所以如果你只提供很少的文件的第一个字节,它会起作用。我已经用 3GB MKV 文件对此进行了测试:

<?php
$finfo = new finfo(FILEINFO_MIME);
var_dump(
    $finfo->buffer(
        file_get_contents('My movie.mkv', false, null, -1, 1024),
        FILEINFO_MIME_TYPE
    )
);

它正在返回:

string(16) "video/x-matroska"

所以成功了!

【讨论】:

很好的例子!谢谢! 在 PHP7 中,我观察到这种方法出现了一个奇怪的错误。整个文件的返回值:image/jpeg; charset=binary,但是当使用你的方法并且只获取前 1024 个字节时,它返回application/octet-stream; charset=binary。使用前 2048 或 4096 个字节时出现同样的错误 您使用哪个 PHP7 版本?我已经使用 PHP 版本 7.0.15-0ubuntu0.16.04.4 (Ubuntu Trusty) 进行了测试,它按预期工作:string(16) "video/x-matroska"。你在测试哪个文件?

以上是关于使用 fileinfo 获取 mime 类型,是大文件的好方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

Mime 类型检测在 PHP 5.3.8 上使用 fileinfo 失败

从php中的文件名获取mime类型

thinkphp5.1 如何判断上传的图片是个图片文件

php文件下载指向链接

启用 php_fileinfo 扩展

给 PHP 添加 MIME 类型知识