如何find与PHP文件的MIMEtypes?

好的,所以我有一个index.php文件,它必须处理许多不同的文件types。 我怎么猜测基于REQUEST_URI的文件types。

如果我请求http://site/image.jpg ,并且所有请求都通过index.phpredirect,如下所示

 <?php include('/www/site'.$_SERVER['REQUEST_URI']); ?> 

我将如何正确地工作?

我应该根据所需文件的扩展名进行testing,还是有办法获取文件types?

如果你确定你只是在处理图像,你可以看看 和getimagesize() exif_imagetype() PHP函数,它试图返回图像的MIMEtypes。

如果你不介意外部的依赖,你也可以检查出很好的getID3库,它可以确定许多不同文件types的MIMEtypes。

最后,您可以查看mime_content_type()函数 – 但Fileinfo PECL扩展名已被弃用。

mime_content_type()被弃用,所以你将无法指望它在未来的工作。 有一个“fileinfo”PECL扩展名,但我没有听说过好东西。

如果您正在* nix服务器上运行,则可以执行以下操作,这对我来说工作正常:

 $file = escapeshellarg( $filename ); $mime = shell_exec("file -bi " . $file); $filename should probably include the absolute path. 
 function get_mime($file) { if (function_exists("finfo_file")) { $finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension $mime = finfo_file($finfo, $file); finfo_close($finfo); return $mime; } else if (function_exists("mime_content_type")) { return mime_content_type($file); } else if (!stristr(ini_get("disable_functions"), "shell_exec")) { // http://stackoverflow.com/a/134930/1593459 $file = escapeshellarg($file); $mime = shell_exec("file -bi " . $file); return $mime; } else { return false; } } 

对我来说,这没有任何工作 – mime_content_type已弃用, finfo未安装,并且不允许shell_exec

我真的厌倦了在PHP中缺乏标准的 MIME嗅探方法。 安装fileinfo …使用不推荐的function…哦,这些工作,但只为图像! 我厌倦了,所以我做了一些研究,发现了WHATWG Mimesniffing规范 – 我相信这仍然是一个规范草案。

无论如何,使用这个规范,我能够在PHP中实现一个mimesniffer。 性能不是问题。 实际上,在我的笨蛋机器上,我能够在PHP超时之前打开并嗅探数千个文件。

这是MimeReader类 。

 require_once("MimeReader.php"); $mime = new MimeReader(<YOUR FILE PATH>); $mime_type_string = $mime->getType(); // "image/jpeg" etc. 

如果你只使用Images,而你需要MIMEtypes(例如头文件),那么这是最快和最直接的答案:

 $file = 'path/to/image.jpg'; $image_mime = image_type_to_mime_type(exif_imagetype($file)); 

即使您重命名图像文件,它也会输出真实的图像MIMEtypes

根据PHP手册, finfo文件function是做到这一点的最好方法。 但是,您将需要安装FileInfo PECL扩展名。

如果扩展名不是选项,则可以使用过时的mime_content_type函数。

mime_content_type()似乎是要走的路,尽pipe上面的评论说它被弃用了。 根据http://php.net/manual/en/function.mime-content-type.php ,它不是 – 或者至less这个mime_content_type()化身不被废弃。 它是FileInfo扩展的一部分,但PHP文档现在告诉我们它是从PHP 5.3.0开始默认启用的。

您可以使用finfo来完成这从PHP 5.3:

 <?php $info = new finfo(FILEINFO_MIME_TYPE); echo $info->file('myImage.jpg'); // prints "image/jpeg" 

FILEINFO_MIME_TYPE标志是可选的; 没有它,你会得到一个更详细的string的一些文件; (显然有些图像types会返回大小和颜色深度信息)。 使用FILEINFO_MIME标志将返回MIMEtypes和编码(如图像/ png;字符集=二进制或文本/ x-php;字符集= us-ascii)。 看到这个网站的更多信息。

我没有使用它,但有一个PECL扩展名获取文件的MIMEtypes。 官方文档在手册中 。

根据您的目的,文件扩展名可以是好的,但它不是非常可靠,因为它很容易改变。

我得到了很好的结果使用用户函数从http://php.net/manual/de/function.mime-content-type.php @''john dot howard at prismmg dot com 26-Oct-2009 03:43' “

 function get_mime_type($filename, $mimePath = '../etc') { ... 

不使用finfo,exec或不推荐使用的函数

也适用于远程资源!

如果你只是处理图像,你可以使用[getimagesize()][1]函数,其中包含图像的各种信息,包括types。

更一般的方法是使用PECL的FileInfo扩展。 这个扩展的PHP文档可以在http://us.php.net/manual/en/ref.fileinfo.phpfind。;

有些人对这个扩展有严重的抱怨,所以如果你遇到严重的问题,或者由于某种原因无法安装扩展,你可能想要查看一下已经废弃的函数mime_content_type()

如果你运行Linux并拥有扩展名,你可以简单地通过创build一个哈希数组来读取/etc/mime.types中的MIMEtypes。 然后你可以将它存储在内存中,只需通过数组键来调用MIME 🙂

 /** * Helper function to extract all mime types from the default Linux /etc/mime.types */ function get_mime_types() { $mime_types = array(); if ( file_exists('/etc/mime.types') && ($fh = fopen('/etc/mime.types', 'r')) !== false ) { while (($line = fgets($fh)) !== false) { if (!trim($line) || substr($line, 0, 1) === '#') continue; $mime_type = preg_split('/\t+/', rtrim($line)); if ( is_array($mime_type) && isset($mime_type[0]) && $mime_type[0] && isset($mime_type[1]) && $mime_type[1] ) { foreach (explode(' ', $mime_type[1]) as $ext) { $mime_types[$ext] = $mime_type[0]; } } } fclose($fh); } return $mime_types; }