代码之家  ›  专栏  ›  技术社区  ›  Clayton

如何使用PHP查找文件的mime类型?

  •  47
  • Clayton  · 技术社区  · 16 年前

    好的,我有一个index.php文件,它必须处理许多不同的文件类型。我如何根据 REQUEST_URI .

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

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

    我怎样才能使它正确工作?

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

    13 回复  |  直到 7 年前
        1
  •  49
  •   leek Bharat Chodvadiya    11 年前

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

    如果你不介意外部依赖,你也可以看看 getID3 可以确定许多不同文件类型的mime类型的库。

    最后,您可以查看 mime_content_type() 函数-但已弃用 Fileinfo PECL延伸

        2
  •  22
  •   Mahmoud Gamal    13 年前

    mime_content_type()已被弃用,因此您将无法指望它在将来工作。有一个“fileinfo”pecl扩展名,但我没有听说过它的好消息。

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

    $file = escapeshellarg( $filename );
    $mime = shell_exec("file -bi " . $file);
    $filename should probably include the absolute path.
    
        3
  •  17
  •   Petah    12 年前
    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 是不允许的。

        4
  •  10
  •   Shane    8 年前

    我真的受够了 标准 PHP中的mime嗅探方法。安装文件信息…使用不推荐使用的函数…哦,这些作品,但仅用于图像!我受够了,所以我做了一些研究,发现 WHATWG Mimesniffing spec -不过,我相信这仍然是一个规范草案。

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

    这里是 MimeReader class .

    require_once("MimeReader.php");
    
    $mime = new MimeReader(<YOUR FILE PATH>);
    $mime_type_string = $mime->getType();     // "image/jpeg" etc.
    
        5
  •  8
  •   Andrew    12 年前

    如果您只使用图像,并且您需要mime类型(例如,对于头),那么这是最快和最直接的答案:

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

    即使重命名图像文件,它也会输出真正的图像mime类型

        6
  •  1
  •   Devon    16 年前

    根据PHP手册, finfo-file 函数是实现这一点的最佳方法。但是,您需要安装 FileInfo PECL延伸

    如果扩展名不是选项,则可以使用过时的 mime_content_type 功能。

        7
  •  1
  •   David    9 年前

    mime_content_type() 尽管上述评论称其已被否决,但这似乎是一条可行之路。它不是——或者至少不是 mime-content-type()。 根据 http://php.net/manual/en/function.mime-content-type.php . 它是fileinfo扩展的一部分,但是php文档现在告诉我们它是从php 5.3.0开始默认启用的。

        8
  •  1
  •   jhaagsma    8 年前

    从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)。见 this site 更多信息。

        9
  •  0
  •   enobrev    16 年前

    我没用过,但有一个 PECL extension 获取文件的mimetype。官方文件在 the manual .

    根据您的目的,文件扩展名可以是正常的,但它并不可靠,因为它很容易更改。

        10
  •  0
  •   j0k gauthamp    12 年前

    我使用用户函数得到了非常好的结果 http://php.net/manual/de/function.mime-content-type.php @“John Dot Howard at Prismmg Dot Com 2009年10月26日03:43”

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

    它不使用finfo、exec或不推荐使用的函数

    也适用于远程资源!

        11
  •  0
  •   BenMorel Manish Pradhan    11 年前

    如果你只处理图像,你可以使用 [getimagesize()][1] 函数,其中包含有关图像的各种信息,包括类型。

    一种更通用的方法是使用pecl中的fileinfo扩展。此扩展的PHP文档可在以下位置找到: http://us.php.net/manual/en/ref.fileinfo.php

    有些人对这个扩展有严重的抱怨…因此,如果遇到严重问题或由于某种原因无法安装扩展,您可能需要签出不推荐使用的函数 mime_content_type()

        12
  •  0
  •   Klemen Tusar    9 年前

    如果您运行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;
    }
    
        13
  •  0
  •   Joshua    7 年前

    您的服务器上任何文件的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');
    
    推荐文章