49

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

如果我请求http://site/image.jpg,并且所有请求都通过 index.php 重定向,看起来像这样

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

我将如何使它正常工作?

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

4

13 回答 13

51

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

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

最后,您可以查看mime_content_type()函数 - 但它已被Fileinfo PECL 扩展所弃用。

于 2008-09-25T17:59:56.347 回答
22

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

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

$file = escapeshellarg( $filename );
$mime = shell_exec("file -bi " . $file);
$filename should probably include the absolute path.
于 2008-09-25T18:05:14.990 回答
18
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不允许。

于 2012-08-30T07:29:28.913 回答
10

实际上,我厌倦了 PHP 中缺乏标准的MIME 嗅探方法。安装文件信息...使用不推荐使用的功能...哦,这些工作,但仅适用于图像!我厌倦了它,所以我做了一些研究并找到了WHATWG Mimesniffing 规范——不过我相信这仍然是一个草案规范。

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

这是MimeReader 类

require_once("MimeReader.php");

$mime = new MimeReader(<YOUR FILE PATH>);
$mime_type_string = $mime->getType();     // "image/jpeg" etc.
于 2013-08-01T02:39:20.073 回答
8

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

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

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

于 2013-03-06T19:34:56.990 回答
1

根据 php 手册,finfo-file函数是最好的方法。但是,您需要安装FileInfo PECL 扩展。

如果扩展名不是一个选项,您可以使用过时的mime_content_type函数。

于 2008-09-25T18:01:38.573 回答
1

mime_content_type()似乎是要走的路,尽管上面的评论说它已被弃用。mime_content_type()根据http://php.net/manual/en/function.mime-content-type.php ,它不是——或者至少这个化身没有被弃用。它是 FileInfo 扩展的一部分,但 PHP 文档现在告诉我们,它从 PHP 5.3.0 开始默认启用。

于 2016-01-31T05:20:22.370 回答
1

从 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)。有关更多信息,请参阅此站点

于 2016-10-12T17:34:25.313 回答
0

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

根据您的目的,文件扩展名可能没问题,但它不是非常可靠,因为它很容易更改。

于 2008-09-25T18:00:47.107 回答
0

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

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

有些人对该扩展有严重的抱怨......因此,如果您遇到严重问题或由于某种原因无法安装扩展,您可能需要查看已弃用的功能mime_content_type()

于 2008-09-25T18:03:18.350 回答
0

我使用来自http://php.net/manual/de/function.mime-content-type.php @''john dot howard at prismmg dot com 26-Oct-2009 03:43'的用户函数得到了非常好的结果 '

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

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

也适用于远程资源!

于 2012-09-12T11:46:16.910 回答
0

如果你运行 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;
}
于 2016-08-24T18:58:38.053 回答
0

你的服务器上的任何文件的 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');
于 2017-11-28T01:02:59.197 回答