Вопрос

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

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

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

Как мне заставить это работать правильно?

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

Это было полезно?

Решение

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

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

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

Другие советы

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

Если вы работаете на *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 не допускается.

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

В любом случае, используя эту спецификацию, мне удалось реализовать мимесниффер на PHP.Производительность не является проблемой.Фактически, на моей скромной машине я смог открыть и просмотреть тысячи файлов до истечения времени ожидания 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));

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

Согласно руководству PHP, finfo-файл функция - лучший способ сделать это.Однако вам потребуется установить Информация о файле Расширение PECL.

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

mime_content_type() кажется, это правильный путь, несмотря на приведенные выше комментарии о том, что он устарел.Это не так, или, по крайней мере, это воплощение mime_content_type() не устарел, согласно 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-тип и кодировку, если она доступна (например,изображение/ПНГ;charset=двоичный или текст/x-php;кодировка=us-ascii).Видеть этот сайт для получения дополнительной информации.

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

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

я получил очень хорошие результаты, используя пользовательскую функцию изhttp://php.net/manual/de/function.mime-content-type.php@''Джон Дот Ховард на prismmg dot com 26 октября 2009 г. 03:43''

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

который не использует finfo, exec или устаревшую функцию

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

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

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

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

Если вы используете 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;
}

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