【问题标题】:Determining a Local File's Mime Type (Content-type) With PHP使用 PHP 确定本地文件的 Mime 类型(内容类型)
【发布时间】:2011-01-28 04:02:15
【问题描述】:

我正在尝试确定文件的 MIME 类型。我尝试了一些方法,但没有想出任何能提供一致输出的方法。我试过$mime = mime_content_type($file) 和$mime = exec('file -bi ' . $file)。我正在提供图片、CSS 和 JavaScript。

示例mime_content_type() 输出:

  • jquery.min.js - 文本/纯文本
  • editor.js - 文本/纯文本
  • admin.css - 文本/纯文本
  • controls.css - 应用程序/x-troff
  • logo.png - 文本/纯文本

示例exec(...) 输出:

  • jquery.min.js - 文本/纯文本; charset=us-ascii
  • editor.js - 文本/x-c++; charset=us-ascii
  • admin.css - 文本/x-c; charset=us-ascii
  • controls.css - 文本/x-c; charset=us-ascii
  • logo.png - 图片/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?
  • pathinfo() 自 PHP 4.0.3 以来一直存在 - us.php.net/pathinfo
  • 赞成添加解决方案,也就是说,提供的解决方案本质上是不安全的,因为它只检查文件扩展名,不应该用于上传的文件来检查有效性。
  • @buggedcom - 我同意。在我的情况下,文件由我们管理,所以这个解决方案是可以接受的。我找不到有效的安全解决方案。我愿意为可行的安全解决方案提供公认的答案。

标签: php file content-type mime-types


【解决方案1】:

Fileinfo 扩展程序将完成这项工作,如果您使用 >= 5.30

  • 您应该尽量避免必须执行命令
  • mime_content_type 在 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';
}

?>

【讨论】:

  • 文件信息是 PHP >= 5.3.0。我在 5.2.6。我刚刚更新了我的帖子以反映这一点。
  • 使用您的解决方案,但您应该将in_array() 更改为array_key_exists() 并颠倒参数。
猜你喜欢
  • 2013-02-09
  • 2014-08-31
  • 2018-07-19
  • 2013-04-21
  • 2016-05-23
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
相关资源
最近更新 更多