2011-11-22 10 views
8

Zauważyłem, że get_mime() jest teraz amortyzowane, więc jaki byłby alternatywny sposób tworzenia poniższej funkcji? Ta funkcja jest używana przez cms, z którymi pracuję, więc potrzebuję niezawodnej alternatywy.Typ MIME PHP sprawdzający alternatywny sposób robienia tego?

// Mime Type Checker 
function get_mime ($filename,$mode=0) { 

    // mode 0 = full check 
    // mode 1 = extension check only 

    $mime_types = array(

     'txt' => 'text/plain', 
     'htm' => 'text/html', 
     'html' => 'text/html', 
     'php' => 'text/html', 
     'css' => 'text/css', 
     'js' => 'application/javascript', 
     'json' => 'application/json', 
     'xml' => 'application/xml', 
     'swf' => 'application/x-shockwave-flash', 
     'flv' => 'video/x-flv', 

     // images 
     'png' => 'image/png', 
     'jpe' => 'image/jpeg', 
     'jpeg' => 'image/jpeg', 
     'jpg' => 'image/jpeg', 
     'gif' => 'image/gif', 
     'bmp' => 'image/bmp', 
     'ico' => 'image/vnd.microsoft.icon', 
     'tiff' => 'image/tiff', 
     'tif' => 'image/tiff', 
     'svg' => 'image/svg+xml', 
     'svgz' => 'image/svg+xml', 

     // archives 
     'zip' => 'application/zip', 
     'rar' => 'application/x-rar-compressed', 
     'exe' => 'application/x-msdownload', 
     'msi' => 'application/x-msdownload', 
     'cab' => 'application/vnd.ms-cab-compressed', 

     // audio/video 
     'mp3' => 'audio/mpeg', 
     'qt' => 'video/quicktime', 
     'mov' => 'video/quicktime', 

     // adobe 
     'pdf' => 'application/pdf', 
     'psd' => 'image/vnd.adobe.photoshop', 
     'ai' => 'application/postscript', 
     'eps' => 'application/postscript', 
     'ps' => 'application/postscript', 

     // ms office 
     'doc' => 'application/msword', 
     'rtf' => 'application/rtf', 
     'xls' => 'application/vnd.ms-excel', 
     'ppt' => 'application/vnd.ms-powerpoint', 
     'docx' => 'application/msword', 
     'xlsx' => 'application/vnd.ms-excel', 
     'pptx' => 'application/vnd.ms-powerpoint', 


     // open office 
     'odt' => 'application/vnd.oasis.opendocument.text', 
     'ods' => 'application/vnd.oasis.opendocument.spreadsheet', 
    ); 

    $ext = strtolower(array_pop(explode('.',$filename))); 

    if (function_exists('mime_content_type') && $mode==0) { 
     $mimetype = mime_content_type($filename); 
     return $mimetype; 
    } 

    if (function_exists('finfo_open') && $mode==0) { 
     $finfo = finfo_open(FILEINFO_MIME); 
     $mimetype = finfo_file($finfo, $filename); 
     finfo_close($finfo); 
     return $mimetype; 

    } elseif (array_key_exists($ext, $mime_types)) { 
     return $mime_types[$ext]; 
    } else { 
     return 'application/octet-stream'; 
    } 
} 
+0

spróbuj użyć funkcji informacji o pliku. możesz uzyskać wyniki za pomocą http://www.php.net/manual/en/ref.fileinfo.php – jeni

+0

FYI: [Generowanie typu MIME w PHP nie jest magiczne] (https://chrisjean.com/2009/02/14/generate-mime-type-in-php-is-not-magic /) –

Odpowiedz

9

finfo_file jest zamiennikiem dla mime_content_type.

Od finfo_file jest dostępna tylko w PHP 5.3.0+, to co zrobiłeś, jest poprawne. Jeśli jest dostępna wersja finfo_file, użyj jej, w przeciwnym razie powróć do mime_content_type, która powinna być dostępna, jeśli nie możemy użyć finfo_file.

Należy zaktualizować kontroli warunkowego tak:

if(function_exists('mime_content_type')&&$mode==0){ 
     $mimetype = mime_content_type($filename); 
     return $mimetype; 

}elseif(function_exists('finfo_open')&&$mode==0){ 
     $finfo = finfo_open(FILEINFO_MIME); 
     $mimetype = finfo_file($finfo, $filename); 
     finfo_close($finfo); 
     return $mimetype; 
}elseif(array_key_exists($ext, $mime_types)){ 
     return $mime_types[$ext]; 
}else { 
     return 'application/octet-stream'; 
} 
+0

Dzięki ... Ta praca dla wydania hosta godaddy.com .. – Sri

1

Użyłem coś takiego jakiś czas temu, wydaje się działać w porządku tak długo, jak masz wersję PHP> 5.3.0:

$fn = "/dir/filename.whatever" 
$mime = finfo_open(FILEINFO_MIME,$mimepath); 
$filetype = finfo_file($mime,$fn); 
finfo_close($mime); 

uwaga; Pamiętam, że $mimepath jest zmienną, która nie jest ustawiona. To spowoduje, że finfo_open() użyje wartości domyślnej dla drugiego parametru.

+2

Zwróć uwagę, że może to zwrócić ciąg znaków, taki jak "video/x-flv; charset = binary" i możesz nie chcieć " charset = binary "part. Sugerowałbym dodanie tej linii do końca powyższego kodu, jeśli chcesz zwrócić tylko typ MIME: $ mimetype = substr ($ mimetype, 0, strpos ($ mimetype, ';')); – Andrew

0
$mime = `file --mime-type $path`; 
$mime = trim(array_pop(explode(':', $mime))); 

Działa to dla mnie.

+0

to działa również dla mnie –

+1

'file -b --mime-type $ path' działa bez potrzeby 'trim (array_pop (explode (': ', $ mime))); ' –

+4

Przepraszamy za komentarz do necro, ale istnieją prawdziwe obawy związane z bezpieczeństwem, aby być świadomym tego podejścia. Tiksy wykonują polecenie powłoki, więc musisz * mocno * odkażać '$ path ', jeśli chcesz zrobić mime sprawdzając w ten sposób. Ponadto używasz komendy POSIX, która nie ma gwarancji bycia w systemie (np. Windows, niestandardowa dystrybucja systemu Linux, inny system operacyjny). –