Как найти MIME-тип файла с php?
Итак, у меня есть индекс.php файл, который должен обрабатывать различные типы файлов. как угадать тип файла на основе REQUEST_URI
.
Если я прошу http://site/image.jpg
, и все запросы перенаправляются через индекс.PHP, который выглядит так
<?php
include('/www/site'.$_SERVER['REQUEST_URI']);
?>
как бы я сделал это правильно?
должен ли я тестировать на основе расширения запрашиваемого файла или есть способ получить тип файла?
13 ответов
Если вы уверены, что работаете только с изображениями, вы можете проверить getimagesize() exif_imagetype () PHP функция, которая пытается вернуть изображение mime-типа.
Если вы не против внешних зависимостей, вы также можете проверить отличные getID3 библиотека, которая может определить MIME-тип многих различных типов файлов.
наконец, вы можете проверить mime_content_type () функция-но она была устаревшей для 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
не допускается.
мне на самом деле надоело отсутствие стандартный методы обнюхивания 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.
Если вы работаете только с изображениями, и вам нужен тип mime (например, для заголовков), то это самый быстрый и самый прямой ответ:
$file = 'path/to/image.jpg';
$image_mime = image_type_to_mime_type(exif_imagetype($file));
Он выведет true image mime type, даже если вы переименуете файл изображения
согласно руководству php,finfo-file функция-лучший способ сделать это. Тем не менее, вам нужно будет установить FileInfo на расширение 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.
вы можете использовать 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=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]
функция, которая содержит все виды информации об изображении, включая тип.
более общим подходом было бы использовать расширение FileInfo из PECL. Документацию по PHP для этого расширения можно найти по адресу:http://us.php.net/manual/en/ref.fileinfo.php
некоторые люди имеют серьезные жалобы на это расширение... поэтому, если вы столкнулись с серьезными проблемами или не можете установить расширение по какой-то причине вы можете проверить устаревшую функцию mime_content_type()
Если вы запускаете Linux и имеете расширение, вы можете просто прочитать тип MIME из /etc/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');