好的,所以我有一个index.php文件,它必须处理许多不同的文件类型.我怎么猜测基于的文件类型REQUEST_URI
.
如果我请求http://site/image.jpg
,并且所有请求都通过index.php重定向,这看起来像这样
我该如何正确地完成这项工作?
我应该根据所请求文件的扩展名进行测试,还是有办法获取文件类型?
如果您确定自己只使用过图像,可以查看 和getimagesize() exif_imagetype() PHP函数,它试图返回图像的mime-type.
如果您不介意外部依赖项,您还可以查看优秀的getID3库,它可以确定许多不同文件类型的mime类型.
最后,您可以查看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 ...使用已弃用的功能......哦,这些工作,但仅适用于图像!我厌倦了它,所以我做了一些研究,发现了WHATWG Mimesniffing规范 - 我相信这仍然是草案规范.
无论如何,使用这个规范,我能够在PHP中实现mimesniffer.性能不是问题.事实上,在我不起眼的机器上,我能够在PHP超时之前打开并嗅探数千个文件.
这是MimeReader类.
require_once("MimeReader.php"); $mime = new MimeReader(); $mime_type_string = $mime->getType(); // "image/jpeg" etc.
如果您只使用图像并且您需要mime类型(例如标题),那么这是最快且最直接的答案:
$file = 'path/to/image.jpg'; $image_mime = image_type_to_mime_type(exif_imagetype($file));
即使重命名图像文件,它也会输出真实的图像mime类型