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

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

<?php
   include('/www/site'.

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

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

<*>

我如何才能正常工作?

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

SERVER['REQUEST_URI']); ?>

我如何才能正常工作?

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

有帮助吗?

解决方案

如果您确定自己只使用过图像,可以查看 getimagesize() exif_imagetype () PHP函数,它试图返回图像mime-type。

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

最后,您可以查看 mime_content_type() function - 但已弃用 Fileinfo PECL扩展。

其他提示

mime_content_type()已弃用,因此您将来无法依赖它。有一个“fileinfo” PECL扩展,但我没有听到有关它的好消息。

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

$file = escapeshellarg( $filename );
$mime = shell_exec("file -bi " . $file);
$filename should probably include the absolute path.
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

我实际上厌倦了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.

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

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

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

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

如果扩展程序不是一个选项,您可以使用过时的 mime_content_type 功能。

mime_content_type()似乎是要走的路,尽管上面的评论说它已被弃用。根据 mime_content_type()的这个版本不被弃用type.php“rel =”nofollow“> http://php.net/manual/en/function.mime-content-type.php 。它是FileInfo扩展的一部分,但PHP文档现在告诉我们它自PHP 5.3.0起默认启用。

从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)。有关详细信息,请参见此网站

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

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

我使用来自的用户功能得到了非常好的结果 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或弃用函数

也适用于远程资源!

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

更通用的方法是使用PECL的FileInfo扩展。可以在以下位置找到此扩展的PHP文档: http://us.php达网络/手动/ EN / ref.fileinfo.php

有些人对此扩展有严重的抱怨......所以如果您遇到严重问题或因某些原因无法安装扩展程序,您可能需要查看已弃用的函数 mime_content_type()

如果您运行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;
}

您的服务器上的任何文件的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');
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top