PHP, nasıl Mime Tipi almak için - Mission Impossible?

3 Cevap php

Mime türü almak için PHP herhangi bir iyi bir yolu var mı?

Ben yoğun geçen birkaç saat arama edilmiş ve her şekilde sorunlarınız üç ana yolu var gibi görünüyor:

  1. mime_content_type() This is deprecated, alot of the times not installed, and if installed will sometimes not find the mime.magic file.

  2. file_info Wasn't installed on the hosts I tried, doesn't seem to have very good support. Is an extension (PECL).

  3. shell_exec(file -ib . $file) Doesn't work on windows servers. I tried it on a linux server and it gave me "image/x-3ds2" for a php file. What the hell is that!!!

Bir dosyanın mime türü almak için bir iyi, neredeyse kurşun geçirmez yolu nedir?

3 Cevap

As workaround you can use the "mime.php" extension from http://upgradephp.berlios.de/ It simulates the mime_content_type() if not available. Made specifically for such cases.

Size özel mime.magic dosya yüklemek ve ini_set ("mime_magic.magicfile") ile zorlayabilir. Bu zaten önerilir, böylece istediğiniz ayarları kullanılabilir olması edilir.

Chris Jean son olarak da geri basit bir extension => mime_type dizisine denk a function called get_file_mime_type that first tries to use the finfo_open yöntemi, ardından da mime_content_type düşer geliştirmiştir. İlk iki seçenek benim sunucuda mevcut değildi zaman bu benim için iyi çalışır. Beats fonksiyonunu kendim yazmak zorunda!

Bazı diğer dosya imza listeleri (like this one here) danışın, magic numbers kullanın ve sonra ilk byte için ikili verileri kontrol edebilirsiniz.

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

Bu aslında çok aynı şekilde, ancak çok uzun (ve daha düşük) bir seviyede çalışır file_info için çok basit bir değiştirme fonksiyonu () 'dir.

Alternatif örneğin this one gibi zaten yapılmış bir dış php sınıfını kullanıyor ..