在没有 MIME 或扩展名的 PHP 中确定文件类型

Posted

技术标签:

【中文标题】在没有 MIME 或扩展名的 PHP 中确定文件类型【英文标题】:Determining file type in PHP without MIME or extension [duplicate] 【发布时间】:2013-11-11 13:15:23 【问题描述】:

我有一个可以上传文件的 php 网站,我希望能够根据文件类型执行某些操作。但是我不想相信浏览器说它是什么类型的文件,而宁愿阅读文件的标题来确定它。 PHP中是否存在为此的任何库?或者这是我需要从头开始写的东西?

【问题讨论】:

【参考方案1】:

PHP 中有一个名为fread() 的函数,您可以使用它来读取二进制文件:

http://php.net/manual/en/function.fread.php

您可以使用它读取文件的前几个字节以获取标题并确定文件类型。

【讨论】:

这远不是确定文件类型的完整方法。 No s*** Sherlock - 显然他必须分析他从文件中读取的内容以确定文件类型。再次阅读他的问题:“......宁愿阅读文件的标题来确定它。PHP 中是否存在任何库?或者这是我需要从头开始编写的东西?” 我读了他的问题。有几种方法可以做到这一点,而无需重新发明***。【参考方案2】:

使用为您执行此操作的 finfo 函数。

以前可以使用 mime_content_type 函数,现在已弃用,所以改为使用

$finfo = new finfo(FILEINFO_MIME);
$type  = $finfo->file('path/filename');

【讨论】:

我不确定为什么这被否决了。虽然,是的,它使用 MIME - 它没有使用浏览器报告的 MIME 类型。 是用文件名来确定MIME吗?还是读取文件头? 我想它使用 mime.magic 更好的方法:$type = finfo_open($path_to_image); @directedition 它不使用文件名来确定 MIME。即使文件上的文件扩展名不正确,这也会报告正确的文件类型,而不管它具有什么扩展名。 mime_content_type ( $path_to_file ) 也可以。【参考方案3】:

文件信息功能可以给你文件类型

 $finfo = finfo_open(FILEINFO_MIME_TYPE);

 echo finfo_file($finfo, $filename);

它可以给出类似的输出

text/html
image/gif
application/vnd.ms-excel

【讨论】:

【参考方案4】:

curl_getinfo 应该可以帮助http://php.net/curl_getinfo 与此问题相关:Get mime type of external file using cURL and php

【讨论】:

以上是关于在没有 MIME 或扩展名的 PHP 中确定文件类型的主要内容,如果未能解决你的问题,请参考以下文章

在 DRUPAL 中验证 PDF 文件上传中的 MIME 类型

如何从 Java 中的 MIME 类型确定适当的文件扩展名

PHP / Mime Types - 公开可用的 mime 类型列表? [关闭]

访问 Apache 的 Mime-Type 到扩展映射

如何使用 php 在文件上设置 mime 类型?

404.17请添加显式mime