2010-05-20 30 views
8

Có cách nào tốt trong PHP để lấy loại mime không?PHP, Cách lấy Mime Type - Mission Impossible?

Tôi đã được tìm kiếm rộng rãi trong vài giờ qua và nó có vẻ như có ba cách chính, mà mỗi chiều gặp vấn đề:

  1. mime_content_type() này bị phản đối, rất nhiều của thời đại không được cài đặt và nếu được cài đặt đôi khi sẽ không tìm thấy tệp mime.magic.

  2. file_info Không được cài đặt trên máy chủ mà tôi đã thử, dường như không hỗ trợ rất tốt. Là một phần mở rộng (PECL).

  3. shell_exec (tệp -ib. $ Tệp) Không hoạt động trên máy chủ Windows. Tôi đã thử nó trên một máy chủ Linux và nó đã cho tôi "hình ảnh/x-3ds2" cho một tập tin php. Cái quái gì thế!!!

Cách tốt, gần như bằng chứng đạn để tải loại tệp mime là gì?

+0

thể trùng lặp của [Làm thế nào để tìm ra mime-type của một tập tin với php?] (Http://stackoverflow.com/ câu hỏi/134833/how-do-i-find-the-mime-type-of-a-file-với-php) –

+0

Erm, tôi rất bối rối. Tôi đọc bài đó, nhưng tôi không thể tìm được câu trả lời hay, ý tôi là, tôi không thể tìm được câu trả lời nào có thể chấp nhận được, có nghĩa là tôi không thể đăng bất kỳ câu hỏi tương tự nào trong tương lai nếu không có câu trả lời tuyệt đối? Whats SO quy tắc? Tôi muốn biết, để tôi có thể theo dõi =) – mysqllearner

+0

Và tôi nghĩ bài đăng này (http://stackoverflow.com/questions/134833/how-do-i-find-the-mime-type-of-a-file -with-php) đã được hỏi 1 năm trước, tôi nghi ngờ sẽ có bất kỳ câu trả lời mới nào cho nó = ( – mysqllearner

Trả lời

2

Như workaround bạn có thể sử dụng "mime.php" mở rộng từ http://upgradephp.berlios.de/ Nó mô phỏng mime_content_type() nếu không có sẵn. Được tạo riêng cho những trường hợp như vậy.

Bạn có thể cài đặt tệp mime.magic riêng của mình và buộc tệp đó bằng ini_set ("mime_magic.magicfile"). Điều này được đề nghị, vì vậy bạn có các cài đặt mong muốn có sẵn.

+0

mime.php chưa hoàn thành và tôi vừa thử nghiệm, nó không hoạt động :( –

0

Chris Jean đã phát triển a function called get_file_mime_type rằng đầu tiên cố gắng sử dụng phương pháp finfo_open, sau đó rơi trở lại vào mime_content_type, rồi cuối cùng quay trở lại một extension => mime_type mảng đơn giản. Nó hoạt động tốt cho tôi khi hai tùy chọn đầu tiên không có sẵn trên máy chủ của tôi. Beats phải tự viết hàm!

0

Bạn có thể sử dụng magic numbers, tham khảo một số danh sách chữ ký tệp khác (like this one here), rồi kiểm tra dữ liệu nhị phân cho byte đầu tiên.

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

Đây thực sự là chức năng thay thế rất đơn giản cho file_info(), hoạt động theo cùng một cách nhưng ở mức mở rộng (và thấp hơn).

Alternative là sử dụng một lớp php bên ngoài đã được thực hiện như this one ví dụ ..

Các vấn đề liên quan