我有一个index.php文件,它必须处理许多不同的文件类型。如何根据REQUEST_URI
猜测文件类型?
如果我请求http://site/image.jpg
,并且所有请求都通过看起来像这样的index.php重定向:
<?php
include('/www/site'.$_SERVER['REQUEST_URI']);
?>
如何使它正确工作?
我应该基于所请求的文件扩展名进行测试,还是有一种获取文件类型的方法?
我有一个index.php文件,它必须处理许多不同的文件类型。如何根据REQUEST_URI
猜测文件类型?
如果我请求http://site/image.jpg
,并且所有请求都通过看起来像这样的index.php重定向:
<?php
include('/www/site'.$_SERVER['REQUEST_URI']);
?>
如何使它正确工作?
我应该基于所请求的文件扩展名进行测试,还是有一种获取文件类型的方法?
mime_content_type()已经被弃用,所以将来可能无法正常工作。虽然有一个名为“fileinfo”的PECL扩展,但我没有听到好的消息。
如果您正在运行类Unix服务器,可以尝试以下方法,这对我来说效果很好:
$file = escapeshellarg($filename);
$mime = shell_exec("file -bi " . $file);
$filename should probably include the absolute path.
mime_content_type
已经被弃用了,依据是什么?根据 https://www.php.net/manual/en/function.mime-content-type.php 看起来并没有被弃用啊。 - Jānis Elmerisfunction get_mime($file) {
if (function_exists("finfo_file")) {
$finfo = finfo_open(FILEINFO_MIME_TYPE); // Return MIME type a la the '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")) {
// https://dev59.com/ZHVC5IYBdhLWcg3w9GLM#134930
$file = escapeshellarg($file);
$mime = shell_exec("file -bi " . $file);
return $mime;
} else {
return false;
}
}
对于我来说,这些都不起作用——mime_content_type
已被弃用,finfo
未安装,而且不允许使用shell_exec
。
我实际上对PHP中缺乏标准 MIME 嗅探方法感到厌烦了。安装 fileinfo......使用弃用的函数......这些东西可以工作,但仅适用于图像!我受够了,所以我进行了一些研究,并找到了WHATWG MIME 嗅探规范 - 尽管我相信这仍然是一份草案。
无论如何,使用此规范,我能够在 PHP 中实现一个 MIME 嗅探器。性能不是问题。事实上,在我的平凡机器上,我能够在 PHP 超时之前打开和嗅探数千个文件。
这里是MimeReader 类。
require_once("MimeReader.php");
$mime = new MimeReader(<YOUR FILE PATH>);
$mime_type_string = $mime->getType(); // "image/jpeg", etc.
如果您只使用图像并需要MIME类型(例如用于标头),那么这是最快且最直接的答案:
$file = 'path/to/image.jpg';
$image_mime = image_type_to_mime_type(exif_imagetype($file));
<?php
$info = new finfo(FILEINFO_MIME_TYPE);
echo $info->file('myImage.jpg');
// prints "image/jpeg"
mime_content_type()
看起来是一个不错的选择,尽管之前的评论说它已经被弃用了。实际上,至少这个版本的 mime_content_type()
没有被弃用,根据 http://php.net/manual/en/function.mime-content-type.php 的说明。它是 FileInfo 扩展的一部分,但 PHP 文档现在告诉我们,自 PHP 5.3.0 起默认启用。
PHP 版本 5.4.7
+ 致命错误:在 C:\XAMPP\htdocs\... 中调用未定义的函数 finfo_open()
。 - trejder可以使用以下代码获取服务器上任何文件的 MIME 类型:
<?php
function get_mime($file_path){
$finfo = new finfo(FILEINFO_MIME_TYPE);
$type = $finfo->file(file_path);
}
$mime = get_mime('path/to/file.ext');
如果你在运行Linux并且安装了相关扩展,你可以通过创建哈希数组从/etc/mime.types中读取MIME类型。然后你可以将其存储到内存中,通过数组键来简单地调用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;
}