在PHP中获取文件的MIME类型的最佳方法

3
什么是获取文件mime类型的最佳方法?在给出任何答案之前,请考虑以下几点:
1.不能依赖上传表单来获取准确性
2.Fileinfo在测试中有不准确的情况
3.mime_content_type像FileInfo一样在测试中也不准确
4.这不仅仅是针对图像类型,因此getImageSize()不是可行的选项。
这是否也可以是apache/server/pear的事情,而不仅仅是依赖于php函数?

1
你能描述一下mime_content_type/fileinfo的不准确性吗?(例如,你觉得它不准确的原因是什么;它无法识别特定类型还是列表不够全面?) - Brad Christie
你可以使用exec("file -i ..")作为替代方案,但它使用与Fileinfo和mime_content_type相同的mime.magic列表。因此取决于你遇到了什么样的问题。 - mario
我描述不准确,就像我上传了一个PDF文件,但返回的是应用程序/未知类型。 - Devin Dixon
2
@Devin:那就更新你的“魔法”表格吧。我的服务器上的fileinfo在我投入的每个PDF文件上都能报告“application/pdf”,没有任何问题。 - Marc B
1个回答

1

很遗憾,在任何编程语言中都没有完美的方法。

获取minetype的两种最标准的方法是:

  1. 从文件扩展名确定...所以something.jpg是jpeg文件,something.doc是word文档。
  2. 从文件中的魔术字符串确定...所以如果文件的前两个字节是0xFF 0xD8,则它是jpeg文件。而办公文档以0xD0 0xCF 0x11 0xE0开头。

这两种方法都有优缺点。

我可以上传一个exe文件,但将其命名为“.jpg”扩展名以打败第一种方式或确定mime类型。

对于这两种类型,我基本上需要一个大型数据库来搜索,以便我可以确定文件属于哪种mimetype。

然而,如果您只对几种文件类型(可能只是jpg、png、gif等)的mimetype感兴趣,则最好的方法(在我看来)是第二种方法。只需保留所有魔术字符串的数据库或数组,并针对该文件进行测试即可。

获取魔术字符串很容易,只需谷歌一下即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接