文件系统-如何使用php查找文件的mime类型?

好的,所以我有一个index.php文件,它必须处理许多不同的文件类型。 我如何猜测基于http://site/image.jpg的文件类型。

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

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

我将如何使其正常工作?

我应该根据所请求文件的扩展名进行测试,还是可以获取文件类型?

13个解决方案
49 votes

如果您确定只使用图像,则可以查看getimagesize()exif_imagetype()PHP函数,尝试返回图像的mime类型。

如果您不介意外部依赖性,则还可以签出出色的getID3库,该库可以确定许多不同文件类型的mime类型。

最后,您可以签出mime_content_type()函数-但Fileinfo PECL扩展名已弃用该函数。

leek answered 2020-02-18T01:30:14Z
22 votes

mime_content_type()已被弃用,因此您将无法指望它将来能正常工作。 有一个“ fileinfo” PECL扩展名,但是我还没有听说过。

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

$file = escapeshellarg( $filename );
$mime = shell_exec("file -bi " . $file);
$filename should probably include the absolute path.
Eric_WVGG answered 2020-02-18T01:30:39Z
18 votes
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

Ale answered 2020-02-18T01:30:59Z
10 votes

实际上,我对PHP中缺乏标准的MIME嗅探方法感到厌烦。 安装fileinfo ...使用不赞成使用的功能...可以使用这些功能,但仅适用于图像! 我受够了,所以我做了一些研究,发现了WHATWG Mimesniffing规范-我相信这仍然是草案规范。

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

这是MimeReader类。

require_once("MimeReader.php");

$mime = new MimeReader(<YOUR FILE PATH>);
$mime_type_string = $mime->getType();     // "image/jpeg" etc.
Shane answered 2020-02-18T01:31:29Z
8 votes

如果您仅使用图片并且需要MIME类型(例如标题),那么这是最快,最直接的答案:

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

即使重命名图像文件,它也会输出真实的图像哑剧类型

Andrew answered 2020-02-18T01:31:53Z
1 votes

根据php手册,finfo-file函数是执行此操作的最佳方法。 但是,您将需要安装FileInfo PECL扩展。

如果没有扩展名,则可以使用过时的mime_content_type函数。

Devon answered 2020-02-18T01:32:18Z
1 votes

尽管上面的评论说它已被弃用,但mime_content_type()似乎仍是解决之道。 根据[http://php.net/manual/en/function.mime-content-type.php。],它不是-或至少不赞成mime_content_type()的化身。它是FileInfo扩展的一部分, 但是PHP文档现在告诉我们PHP 5.3.0起默认启用它。

David answered 2020-02-18T01:32:39Z
1 votes

从PHP 5.3开始,您可以使用finfo来完成此操作:

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

FILEINFO_MIME_TYPE标志是可选的; 没有它,您将得到一些文件的详细字符串; (显然,某些图像类型将返回尺寸和颜色深度信息)。 使用FILEINFO_MIME标志返回mime类型和编码(如果可用)(例如image / png; charset = binary或text / x-php; charset = us-ascii)。 有关更多信息,请参见此网站。

jhaagsma answered 2020-02-18T01:33:04Z
0 votes

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

根据您的目的,可以使用文件扩展名,但由于更改很容易,因此文件扩展名不是很可靠。

enobrev answered 2020-02-18T01:33:28Z
0 votes

我从使用用户功能获得了很好的结果[http://php.net/manual/de/function.mime-content-type.php]@''约翰·道特·霍华德at Prismmg dot com 2009年10月26日03:43''

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

不使用查找,执行或不推荐使用的功能

远程资源也能很好地工作!

vizzy answered 2020-02-18T01:33:57Z
0 votes

如果仅处理图像,则可以使用mime_content_type()函数,该函数包含有关图像的各种信息,包括类型。

更通用的方法是使用PECL的FileInfo扩展名。 可以在以下位置找到此扩展的PHP文档:[http://us.php.net/manual/zh/ref.fileinfo.php]

某些人对该扩展程序有严重的投诉...因此,如果您遇到严重问题或由于某种原因无法安装扩展程序,则可能要检查不赞成使用的功能mime_content_type()

phatduckk answered 2020-02-18T01:34:28Z
0 votes

如果您运行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;
}
techouse answered 2020-02-18T01:34:48Z
0 votes

服务器上任何文件的哑剧都可以用这个来获得

<?php
function get_mime($file_path){
  $finfo = new finfo(FILEINFO_MIME_TYPE);
  $type  = $finfo->file(file_path);
}

$mime = get_mime('path/to/file.ext');
Joshua answered 2020-02-18T01:35:08Z
translate from https://stackoverflow.com:/questions/134833/how-do-i-find-the-mime-type-of-a-file-with-php