2009-08-05 3 views
15

Я использую PHP для отправки электронной почты с приложением. Вложением может быть любой из нескольких типов файлов (pdf, txt, doc, swf и т. Д.).Как получить тип содержимого файла в PHP?

Во-первых, скрипт получает файл, используя «file_get_contents».

Позже сценарий повторяет в заголовке:

Content-Type: <?php echo $the_content_type; ?>; name="<?php echo $the_file_name; ?>" 

Как я установить правильное значение для the_content_type$?

ответ

-2

Существует функция заголовка:

header('Content-Type: '.$the_content_type); 

Обратите внимание, что эта функция должна быть вызвана перед тем любой выходной. Вы можете найти более подробную информацию в справочнике http://php.net/header

Edit:

Ops, я понял вопрос: Поскольку PHP 4.0 есть функция mime_content_type для обнаружения MimeType файла.

В php 5 устарел, его следует заменить на набор функций file info.

+0

Я думаю, что это не вопрос ... ed.talmage необходимо определить тип/тип содержимого прикрепленного файла, заголовок уже сделан забота о. – JorenB

+0

Пойманный! Я просто модифицировал ответ, между прочим;) – Eineki

-3

Я действительно рекомендую использовать фреймворк, например, «CodeIgniter» для отправки электронных писем. Вот скринкаст о «Отправлять письма с помощью CodeIgniter» всего за 18 минут.

http://net.tutsplus.com/videos/screencasts/codeigniter-from-scratch-day-3/

+0

Да, я планирую использовать это в будущем. Спасибо за ссылку. – edt

4

Вот пример использования finfo_open который доступен в PHP5 и PECL:

$mimepath='/usr/share/magic'; // may differ depending on your machine 
// try /usr/share/file/magic if it doesn't work 
$mime = finfo_open(FILEINFO_MIME,$mimepath); 
if ($mime===FALSE) { 
throw new Exception('Unable to open finfo'); 
} 
$filetype = finfo_file($mime,$tmpFileName); 
finfo_close($mime); 
if ($filetype===FALSE) { 
throw new Exception('Unable to recognise filetype'); 
} 

В качестве альтернативы, вы можете использовать осуждается mime_ content_ type функции:

$filetype=mime_content_type($tmpFileName); 

или использование ОС в встроенных функциях:

ob_start(); 
system('/usr/bin/file -i -b ' . realpath($tmpFileName)); 
$type = ob_get_clean(); 
$parts = explode(';', $type); 
$filetype=trim($parts[0]); 
-3

попробовать это:

function ftype($f) { 
        curl_setopt_array(($c = @curl_init((!preg_match("/[a-z]+:\/{2}(?:www\.)?/i",$f) ? sprintf("%s://%s/%s", "http" , $_SERVER['HTTP_HOST'],$f) : $f))), array(CURLOPT_RETURNTRANSFER => 1, CURLOPT_HEADER => 1)); 
         return(preg_match("/Type:\s*(?<mime_type>[^\n]+)/i", @curl_exec($c), $m) && curl_getinfo($c, CURLINFO_HTTP_CODE) != 404) ? ($m["mime_type"]) : 0; 

     } 
echo ftype("http://img2.orkut.com/images/medium/1283204135/604747203/ln.jpg"); // print image/jpeg 
+11

Священный нечитаемый тернарный оператор, Бэтмен! ; -P – deceze

25

Я использую эту функцию, которая включает в себя несколько резервных объявлений, чтобы компенсировать более старые версии PHP или просто плохие результаты:

function getFileMimeType($file) { 
    if (function_exists('finfo_file')) { 
     $finfo = finfo_open(FILEINFO_MIME_TYPE); 
     $type = finfo_file($finfo, $file); 
     finfo_close($finfo); 
    } else { 
     require_once 'upgradephp/ext/mime.php'; 
     $type = mime_content_type($file); 
    } 

    if (!$type || in_array($type, array('application/octet-stream', 'text/plain'))) { 
     $secondOpinion = exec('file -b --mime-type ' . escapeshellarg($file), $foo, $returnCode); 
     if ($returnCode === 0 && $secondOpinion) { 
      $type = $secondOpinion; 
     } 
    } 

    if (!$type || in_array($type, array('application/octet-stream', 'text/plain'))) { 
     require_once 'upgradephp/ext/mime.php'; 
     $exifImageType = exif_imagetype($file); 
     if ($exifImageType !== false) { 
      $type = image_type_to_mime_type($exifImageType); 
     } 
    } 

    return $type; 
} 

Он пытается использовать новые функции PHP finfo. Если они недоступны, он использует альтернативу mime_content_type и включает замену замены из библиотеки Upgrade.php, чтобы убедиться, что она существует. Если они не вернут ничего полезного, он попробует команду ОС file. AFAIK, доступный только на системах * NIX, вы можете изменить это или избавиться от него, если вы планируете использовать его в Windows. Если ничего не получилось, он пытается вернуть exif_imagetype в качестве резерва только для изображений.

Я пришел к выводу, что разные серверы сильно различаются в своей поддержке функций типа mime и что замена Upgrade.php mime_content_type далека от совершенства. Ограниченные функции exif_imagetype, как оригинальные, так и замена Upgrade.php, работают довольно надежно. Если вас беспокоят только изображения, вы можете использовать только этот последний.

+0

Отказ от команды 'file' является избыточным. Расширение FileInfo (и функция mime_content_type) использует ту же базу данных обнаружения файлов, что и команда 'file'. –

+0

@Sander В моих тестах я нашел 'mime_content_type' несколько ненадежным или, возможно, его замена update.php была, а вызов' file' обычно успешным. Мне придется заглянуть в это больше, чтобы узнать, когда и почему это не удается при каких обстоятельствах. По крайней мере, это не вредит. :) – deceze

+0

Я быстро просмотрел код Upgrade.php для mime_content_type. Сначала он пытается расширить расширение FileInfo PECL. Если этого не существует, он пытается проанализировать файл 'magic' сам по себе, в PHP. Проблема: он выглядит только в нескольких предопределенных местах для файла 'magic'. Например, он не работает на моем Debian Squeeze. Также возможно, что у парсера есть ошибки, но я не проверял это полностью. –

2
function getMimeType($filename) { 
     $realpath = realpath($filename); 
     if ($realpath 
       && function_exists('finfo_file') 
       && function_exists('finfo_open') 
       && defined('FILEINFO_MIME_TYPE') 
     ) { 
       // Use the Fileinfo PECL extension (PHP 5.3+) 
       return finfo_file(finfo_open(FILEINFO_MIME_TYPE), $realpath); 
     } 
     if (function_exists('mime_content_type')) { 
       // Deprecated in PHP 5.3 
       return mime_content_type($realpath); 
     } 
     return false; 
} 

Это работало для меня

Why is mime_content_type() deprecated in PHP?

0

Я думаю, что я нашел короткий путь. Получить размер изображения с помощью:

$infFil=getimagesize($the_file_name);

и

Content-Type: <?php echo $infFil["mime"] ?>; name="<?php echo $the_file_name; ?>" 

getimagesize возвращает ассоциативный массив, которые имеют MIME ключ

Я использовал его, и он работает

4

Это очень легко получить его в php.

Просто позвоните следующей функции PHP mime_content_type

<?php 
    $filelink= 'uploads/some_file.pdf'; 
    $the_content_type = ""; 

    // check if the file exist before 
    if(is_file($file_link)) { 
     $the_content_type = mime_content_type($file_link); 
    } 
    // You can now use it here. 

?> 

PHP documentation of the function mime_content_type() Надеется, что это помогает кому-то

0

Я попытался большинство предложений, но все они не для меня (я между ними каким-либо Полезным версия PHP apparantly. В результате я получил следующую функцию:

function getShellFileMimetype($file) { 
    $type = shell_exec('file -i -b '. escapeshellcmd(realpath($_SERVER['DOCUMENT_ROOT'].$file))); 
    if(strpos($type, ";")!==false){ 
     $type = current(explode(";", $type)); 
    } 
    return $type; 
}