Как найти mime-тип файла с php?

Итак, у меня есть файл index.php, который обрабатывает много разных типов файлов. как я могу определить тип файла на основе REQUEST_URI.

Если я запрашиваю http://site/image.jpg, и все запросы перенаправляют через index.php, который выглядит как

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

Как я могу сделать эту работу правильно?

Должен ли я тестировать на основе расширения запрошенного файла или есть способ получить тип файла?

Ответ 1

Если вы уверены, что работаете только с изображениями, вы можете проверить getimagesize() exif_imagetype() Функция PHP, которая пытается вернуть образ mime-типа.

Если вы не возражаете против внешних зависимостей, вы также можете проверить отличную библиотеку getID3, которая может определять тип mime много разных типов файлов.

Наконец, вы можете проверить функцию mime_content_type(), но она устарела для Fileinfo Расширение PECL.

Ответ 2

mime_content_type() устарел, поэтому вы не сможете рассчитывать на его работу в будущем. Существует расширение "fileinfo" PECL, но я ничего не слышал об этом.

Если вы работаете на сервере * nix, вы можете сделать следующее, что отлично сработало для меня:

$file = escapeshellarg( $filename );
$mime = shell_exec("file -bi " . $file);
$filename should probably include the absolute path.

Ответ 3

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

Мне действительно надоело отсутствовать стандартные методы нюхания MIME в PHP. Установите fileinfo... Используйте устаревшие функции... О, эти работы, но только для изображений! Я устал от этого, поэтому сделал некоторые исследования и нашел WHATWG Mimesniffing spec - я считаю, что это все еще черновик.

В любом случае, используя эту спецификацию, мне удалось реализовать mimesniffer в PHP. Производительность не является проблемой. Фактически на моей скромной машине я смог открыть и обнюхать тысячи файлов до того, как время ожидания PHP.

Вот класс MimeReader.

require_once("MimeReader.php");

$mime = new MimeReader(<YOUR FILE PATH>);
$mime_type_string = $mime->getType();     // "image/jpeg" etc.

Ответ 5

Если вы работаете только с изображениями, и вам нужен тип mime (например, для заголовков), это самый быстрый и самый прямой ответ:

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

Он выведет true mime-тип изображения, даже если вы переименуете свой файл изображения

Ответ 6

В соответствии с руководством php функция finfo-file - лучший способ сделать это. Однако вам нужно будет установить расширение FileInfo PECL.

Если расширение не является опцией, вы можете использовать устаревшую функцию mime_content_type.

Ответ 7

mime_content_type(), как представляется, способ идти, несмотря на вышеприведенные комментарии, говоря, что он устарел. Это не так - или, по крайней мере, это воплощение mime_content_type() не устарело, согласно http://php.net/manual/en/function.mime-content-type.php. Он является частью расширения FileInfo, но в документации по PHP теперь указывается, что он включен по умолчанию с PHP 5.3.0.

Ответ 8

Вы можете использовать finfo для выполнения этого с PHP 5.3:

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

Флаг FILEINFO_MIME_TYPE не является обязательным; без него вы получите более подробную строку для некоторых файлов; (видимо, некоторые типы изображений возвращают информацию о размере и глубине цвета). Использование флага FILEINFO_MIME возвращает тип mime и кодировку, если они доступны (например, image/png; charset = двоичный или text/x-php; charset = us-ascii). Для получения дополнительной информации см. этот сайт.

Ответ 9

Я не использовал его, но там есть расширение PECL для получения типа файла. Официальная документация для него находится в руководстве.

В зависимости от ваших целей расширение файла может быть в порядке, но оно не невероятно надежно, так как оно так легко изменилось.

Ответ 10

Если вы используете только изображения, вы можете использовать функцию [getimagesize()][1], которая содержит все виды информации об изображении, включая тип.

Более общий подход заключается в использовании расширения FileInfo из PECL. Документацию PHP для этого расширения можно найти по адресу: http://us.php.net/manual/en/ref.fileinfo.php

У некоторых людей есть серьезные жалобы на это расширение... так что если у вас возникают серьезные проблемы или вы не можете установить расширение по какой-то причине, вы можете проверить устаревшую функцию mime_content_type()

Ответ 11

Я получил очень хорошие результаты, используя функцию пользователя из 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 или устаревшую функцию

хорошо работает и с удаленными ресурсами!

Ответ 12

Если вы запустите Linux и у вас есть расширение, вы можете просто прочитать MIME-тип из /etc/mime.types, создав хэш-массив. Затем вы можете сохранить это в памяти и просто вызвать 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

Мим любого файла на вашем сервере можно получить с помощью этого

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

$mime = get_mime('path/to/file.ext');