使用PHP确定本地文件的Mime类型(内容类型)

3
我正在尝试确定文件的MIME类型。我尝试了几种方法,但没有得到一致的输出结果。我尝试过$mime = mime_content_type($file)$mime = exec('file -bi ' . $file)。我正在提供图像、CSS和JavaScript。 mime_content_type()输出示例:
  • jquery.min.js - text/plain
  • editor.js - text/plain
  • admin.css - text/plain
  • controls.css - application/x-troff
  • logo.png - text/plain
exec(...)输出示例:
  • jquery.min.js - text/plain; charset=us-ascii
  • editor.js - text/x-c++; charset=us-ascii
  • admin.css - text/x-c; charset=us-ascii
  • controls.css - text/x-c; charset=us-ascii
  • logo.png - image/png
正如您所看到的,结果五花八门。 我的PHP版本是5.2.6
解决方案(感谢Jacob)
$mimetypes = array(
    'gif' => 'image/gif',
    'png' => 'image/png',
    'jpg' => 'image/jpg',
    'css' => 'text/css',
    'js' => 'text/javascript',
);
$path_parts = pathinfo($file);
if (array_key_exists($path_parts['extension'], $mimetypes)) {
    $mime = $mimetypes[$path_parts['extension']];
} else {
    $mime = 'application/octet-stream';
}

你说你正在使用5.2.6,那么你是如何使用fileinfo的? - Jacob Relkin
pathinfo()自PHP 4.0.3以来就存在 - http://us.php.net/pathinfo - Sonny
2
点赞添加解决方案,不过提供的解决方案本质上是不安全的,因为它只检查文件扩展名,不应用于上传文件以检查有效性。 - buggedcom
@buggedcom - 我同意。在我的情况下,文件是由我们管理的,因此这个解决方案是可接受的。我找不到一个安全的解决方案来解决问题。如果有一个安全的解决方案可以解决问题,我愿意授予一个被接受的答案。 - Sonny
1个回答

4
如果您的PHP版本大于或等于5.30,则可以使用Fileinfo扩展来完成这项工作。

  • 应该尽量避免执行命令
  • mime_content_type在PHP 5.30中已被弃用

如果不幸的是您的PHP版本小于5.30,那么我可能只能自己写,它比上述函数/命令更可靠。

这里有一个例子:

<?php
$filename = 'FILENAME HERE';
$mimetypes = array('png' => 'image/png', 'jpg' => 'image/jpg', 'css' => 'text/css',
    'js' => 'application/x-javascript'
    // any other extensions that you may be serving      
);

$ext = strtolower(substr($filename, strrpos($filename, '.') + 1, strlen($filename)));
if(array_key_exists($ext, $mimetypes)) {
    $mime = $mimetypes[$ext];
} else {
    echo 'mime type not found';
}

?>

Fileinfo需要PHP版本大于等于5.3.0。我的PHP版本是5.2.6。我已经更新了我的帖子以反映这一点。 - Sonny
1
使用您的解决方案,但应将 in_array() 更改为 array_key_exists() 并反转参数。 - Sonny

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