2010-05-20 14 views
8

Czy jest jakiś przyzwoity sposób w PHP, aby uzyskać typ MIME?PHP, Jak uzyskać typ Mime - Mission Impossible?

I zostały poszukiwania intensywnie w ciągu ostatnich kilku godzin i wydaje się, że istnieją trzy główne sposoby, które każdy sposób mający problemy:

  1. mime_content_type() ta jest przestarzała, dużo czasu nie zostało zainstalowane , a jeśli jest zainstalowany, czasami nie znajdzie pliku mime.magic.

  2. file_info Nie został zainstalowany na hostach, które wypróbowałem, nie ma bardzo dobrej obsługi. Jest rozszerzeniem (PECL).

  3. shell_exec (plik -ib. $ Plik) Nie działa na serwerach Windows. Próbowałem go na serwerze Linux i dało mi "image/x-3ds2" dla pliku php. Co to do diabła jest!!!

Co to jest dobry, prawie kuloodporny sposób na uzyskanie typu pliku MIME?

+0

możliwe duplikat [Jak znajdę MIME typu pliku z php?] (Http://stackoverflow.com/ pytania/134833/how-do-i-find-the-mime-type-of-a-file-with-php) –

+0

Erm, jestem odrobinę zmieszany. Czytam dokładnie ten post, ale nie mogę znaleźć żadnych dobrych odpowiedzi, mam na myśli, nie mogę znaleźć żadnych akceptowalnych odpowiedzi, czy to znaczy, nie mogę zamieścić podobnych pytań w przyszłości, jeśli nie ma jeszcze absolutnej odpowiedzi? Co SO rządzi? Chcę wiedzieć, żebym mógł śledzić =) – mysqllearner

+0

I myślę, że ten post (http://stackoverflow.com/questions/134833/how-do-i-find-time-mime-type-of-a-file -with-php) zostałam zapytana 1 rok temu, wątpię, czy pojawiłyby się na nim jakieś nowe odpowiedzi = ( – mysqllearner

Odpowiedz

2

Jako obejście można użyć „mime.php” rozszerzenie z http://upgradephp.berlios.de/ symuluje ona mime_content_type() jeśli nie są dostępne. Wykonane specjalnie dla takich przypadków.

Możesz zainstalować swój prywatny plik mime.magic i wymusić go ini_set ("mime_magic.magicfile"). Jest to zalecane mimo to, więc dostępne są pożądane ustawienia.

+0

mime.php jest niedokończona, a ja właśnie ją przetestowałem, to nie działa :( –

0

Chris Jean opracowała a function called get_file_mime_type że najpierw próbuje użyć metody finfo_open, a następnie wraca do mime_content_type, w końcu wraca do prostego extension => mime_type tablicy. Działa to dobrze, gdy dwie pierwsze opcje nie były dostępne na moim serwerze. Beats musi sam napisać funkcję!

0

Możesz użyć magic numbers, przejrzeć inne listy podpisów plików (like this one here), a następnie sprawdzić dane binarne dla pierwszego bajtu.

function getfiletype($file) { 
    $handle = @fopen($file, 'r'); 
    if (!$handle) 
     throw new Exception('File error - Can not open File or file missing'); 

    $types = array('jpeg' => "\xFF\xD8\xFF", 
        'gif' => 'GIF', 
        'bmp' => 'BM', 
        'tiff' => '\x49\x20\x49', 
        'png' => "\x89\x50\x4e\x47\x0d\x0a", 
        'psd' => '8BPS', 
        'swf' => 'FWS'); 

    $bytes = fgets($handle, 8); 
    $filetype = 'other'; 

    foreach ($types as $type => $header) { 
     if (strpos($bytes, $header) === 0) { 
      $filetype = $type; 
      break; 
     } 
    } 
    fclose($handle); 
    return $filetype; 
} 

Właściwie jest to bardzo proste funkcja zastąpienie file_info(), która działa w taki sam sposób, ale na znacznie rozszerzony (i niższym) poziomie.

alternatywna jest już wykonane przy użyciu zewnętrznego klasę php jak this one np ..