2009-08-05 14 views
15

Używam PHP do wysyłania wiadomości e-mail z załącznikiem. Załącznik może być jednym z kilku różnych typów plików (pdf, txt, doc, swf itp.).Jak uzyskać typ zawartości pliku w PHP?

Najpierw skrypt pobiera plik za pomocą "file_get_contents".

Później scenariusz powtarza się w nagłówku:

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

Jak ustawić prawidłową wartość $ the_content_type?

Odpowiedz

-2

Jest nagłówek funkcji:

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

Zauważ, że funkcja ta musi być wywołana przed dowolnego wyjścia. Można znaleźć dalsze szczegóły w odniesieniu http://php.net/header

Edit:

Ops, ja źle na pytanie: Od PHP 4.0 jest funkcja mime_content_type wykryć typ MIME pliku.

W php 5 jest przestarzałe, należy go zastąpić zestawem funkcji file info.

+0

Myślę, że to nie jest pytanie ... ed.talmage musi określić typ/typ zawartości załączonego pliku, nagłówek jest już zajęty dbać o. – JorenB

+0

Złapany! Po prostu zmieniałem odpowiedź, przy okazji;) – Eineki

4

Oto przykład przy użyciu finfo_open który jest dostępny w PHP5 i 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'); 
} 

Alternatywnie, można użyć przestarzałe mime_ content_ type funkcję:

$filetype=mime_content_type($tmpFileName); 

lub wykorzystanie systemy operacyjne w wbudowanych funkcjach:

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

spróbuj tego:

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

Święty nieczytelny potrójny operator, Batman! ;-P – deceze

25

używam tej funkcji, która zawiera kilka fallbacks aby zrekompensować starszymi wersjami PHP, lub po prostu złych wyników:

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; 
} 

Próbuje użyć nowsze funkcje PHP finfo. Jeśli nie są one dostępne, używa alternatywy mime_content_type i zawiera zamiennik typu drop-in z biblioteki Upgrade.php, aby upewnić się, że takowa istnieje. Jeśli te nie zwróci nic użytecznego, wypróbuje komendę OS "file. AFAIK, który jest dostępny tylko w systemach * NIX, możesz go zmienić lub pozbyć się go, jeśli planujesz go użyć w systemie Windows. Jeśli nic nie zadziałało, to próbuje exif_imagetype jako rezerwę tylko dla obrazów.

Zauważyłem, że różne serwery różnią się znacznie pod względem obsługi funkcji typu MIME, a zamiennik Upgrade.php mime_content_type jest daleki od ideału. Ograniczone funkcje exif_imagetype, zarówno oryginalne, jak i uaktualnienie Upgrade.php, działają jednak niezawodnie. Jeśli interesują Cię tylko obrazy, możesz użyć tego ostatniego.

+0

Zastąpienie polecenia 'file' jest zbędne. Rozszerzenie FileInfo (i funkcja mime_content_type) używa tej samej bazy danych wykrywania plików co komenda 'file'. –

+0

@Sander W moich testach znalazłem 'mime_content_type' jako nieco niewiarygodne, lub prawdopodobnie jego upgrade.php zamiennik był, podczas gdy wywołanie' file' zwykle kończy się sukcesem. Będę musiał zagłębić się w to więcej, aby zobaczyć, kiedy i dlaczego zawodzi, w jakich okolicznościach. Przynajmniej nie ma tam żadnej krzywdy. :) – deceze

+0

Rzuciłem okiem na kod Upgrade.php dla mime_content_type. Najpierw próbuje rozszerzyć FileInfo PECL. Jeśli to nie istnieje, spróbuje samodzielnie przeanalizować plik 'magic' w PHP. Problem: Wygląda tylko w kilku predefiniowanych miejscach dla pliku 'magic'. Nie działa na przykład w przypadku Debiana Squeeze. Możliwe jest również, że parser zawiera błędy, ale nie sprawdziłem dokładnie tego. –

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; 
} 

ten pracował dla mnie

Why is mime_content_type() deprecated in PHP?

0

myślę, że znalazłem krótką drogę. Uzyskaj rozmiar obrazu za pomocą:

$infFil=getimagesize($the_file_name);

i

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

getimagesize zwraca tablicę asocjacyjną które mają MIME kluczową

użyłem go i działa

4

To bardzo łatwo mieć go w php.

Wystarczy zadzwonić Poniższa funkcja 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() Mam nadzieję, że ktoś pomoże

0

próbowałam większość sugestii, ale wszystkie one nie dla mnie (jestem pomiędzy nimi jakiegokolwiek usefull wersja PHP podobno zakończyłem z następującą funkcją:

Powiązane problemy