2009-07-18 28 views
23

Có ánh xạ nhanh chóng và bẩn của các loại MIME đến các phần mở rộng trong PHP mà tôi có thể sử dụng không?Làm cách nào để xác định (các) tiện ích được liên kết với loại MIME bằng PHP?

+0

Peo ple đơn thuần muốn bản đồ * extensions * thành * MIME type *, chứ không phải vòng tròn khác, nên lưu ý rằng bây giờ đã có sẵn hỗ trợ cho cái này mà chúng nên tận dụng - xem [câu trả lời của Jorge] (http: // stackoverflow.com/a/20494035/1709587) thay vì được chấp nhận. Tuy nhiên, –

+1

@MarkAmery như đã lưu ý, finfo_file() yêu cầu tệp tồn tại. Mà không phải luôn luôn như vậy. Câu trả lời của Chaos vẫn còn quan trọng hơn đối với OP và vẫn còn hiệu lực sau 8 năm. – Wranorn

Trả lời

21

Không built-in, nhưng nó không phải là terribly khó để cuộn của riêng bạn:

function system_extension_mime_types() { 
    # Returns the system MIME type mapping of extensions to MIME types, as defined in /etc/mime.types. 
    $out = array(); 
    $file = fopen('/etc/mime.types', 'r'); 
    while(($line = fgets($file)) !== false) { 
     $line = trim(preg_replace('/#.*/', '', $line)); 
     if(!$line) 
      continue; 
     $parts = preg_split('/\s+/', $line); 
     if(count($parts) == 1) 
      continue; 
     $type = array_shift($parts); 
     foreach($parts as $part) 
      $out[$part] = $type; 
    } 
    fclose($file); 
    return $out; 
} 

function system_extension_mime_type($file) { 
    # Returns the system MIME type (as defined in /etc/mime.types) for the filename specified. 
    # 
    # $file - the filename to examine 
    static $types; 
    if(!isset($types)) 
     $types = system_extension_mime_types(); 
    $ext = pathinfo($file, PATHINFO_EXTENSION); 
    if(!$ext) 
     $ext = $file; 
    $ext = strtolower($ext); 
    return isset($types[$ext]) ? $types[$ext] : null; 
} 

function system_mime_type_extensions() { 
    # Returns the system MIME type mapping of MIME types to extensions, as defined in /etc/mime.types (considering the first 
    # extension listed to be canonical). 
    $out = array(); 
    $file = fopen('/etc/mime.types', 'r'); 
    while(($line = fgets($file)) !== false) { 
     $line = trim(preg_replace('/#.*/', '', $line)); 
     if(!$line) 
      continue; 
     $parts = preg_split('/\s+/', $line); 
     if(count($parts) == 1) 
      continue; 
     $type = array_shift($parts); 
     if(!isset($out[$type])) 
      $out[$type] = array_shift($parts); 
    } 
    fclose($file); 
    return $out; 
} 

function system_mime_type_extension($type) { 
    # Returns the canonical file extension for the MIME type specified, as defined in /etc/mime.types (considering the first 
    # extension listed to be canonical). 
    # 
    # $type - the MIME type 
    static $exts; 
    if(!isset($exts)) 
     $exts = system_mime_type_extensions(); 
    return isset($exts[$type]) ? $exts[$type] : null; 
} 
+5

Tôi nghĩ đây là câu trả lời cũ. Bây giờ bạn nên sử dụng 'fileinfo' http://www.php.net/manual/en/ref.fileinfo.php –

+6

@ JorgeB.G. Điều đó đòi hỏi rằng các tập tin tồn tại, phải không? – danronmoon

+1

@danronmoon. có nó. – Qix

2

Nếu bạn muốn sử dụng một webservice, tôi vừa tạo này như một phần của Mimetype tôi < -> dịch vụ biểu tượng

http://stdicon.com/

Ví dụ:

http://stdicon.com/ext/html

Nó chạy trên appengine vì vậy nó phải có sẵn sàng cao.

+1

-1; không cần sử dụng dịch vụ web cho việc này khi nó có thể đạt được cục bộ, nó không cho phép ánh xạ các loại MIME * tới * mở rộng (những gì OP yêu cầu), và dịch vụ web vì nó hiện thiếu các phần mở rộng mà địa phương của tôi Tệp 'mime.types' trên một cài đặt Ubuntu thông thường hiểu, như' .woff'. –

+0

Điều hướng đến http://stdicon.com tạo ra lỗi cho tôi. Liên kết đến pastebin: http://pastebin.com/BjkGRv7H. Cần lưu ý rằng bản thân dịch vụ hoạt động OK. – starbeamrainbowlabs

6

Bạn có thể sử dụng mime_content_type nhưng không được dùng nữa. Sử dụng fileinfo thay vì:

function getMimeType($filename) { 
    $finfo = finfo_open(FILEINFO_MIME_TYPE); 
    $mime = finfo_file($finfo, $filename); 
    finfo_close($finfo); 
    return $mime; 
} 
+4

Cần lưu ý rằng OP thực sự được yêu cầu ánh xạ các loại MIME * tới * mở rộng tệp. Điều này vẫn bao gồm các trường hợp sử dụng phổ biến nhất (và có lẽ là một trong những OP đã phải đối mặt với), do đó, nó chắc chắn xứng đáng để tồn tại và tôi đã +1 nó, nhưng nó không * đúng một câu trả lời cho câu hỏi đã được hỏi như pedantically được giải thích. –

+8

Lưu ý: 'finfo_file()' và 'mime_content_type()' yêu cầu tệp đó tồn tại. – Pang

+2

Ở đâu nó nói rằng nó không được chấp nhận? – Greg

2

Nếu bạn đang làm việc với các phần mở rộng khác nhau hạn chế của hình ảnh và cần một cái gì đó rất đơn giản, tôi nghĩ rằng điều này là đủ.

switch($info['mime']) 
    { 
    case 'image/gif' : $extension = 'gif'; break; 
    case 'image/png' : $extension = 'png'; break; 
    case 'image/jpeg' : $extension = 'jpg'; break; 

    default : 
     throw new ApplicationException('The file uploaded was not a valid image file.'); 
    break; 
    } 
2

Bạn có thể muốn sử dụng thư viện này: https://github.com/ralouphie/mimey

Ví dụ sử dụng:

$mimes = new \Mimey\MimeTypes; 

// Convert extension to MIME type: 
$mimes->getMimeType('json'); // application/json 

// Convert MIME type to extension: 
$mimes->getExtension('application/json'); // json 

này vì rõ ràng là chất lượng của các chức năng PHP cung cấp là không rõ ràng.

0

sử dụng tập tin này: https://github.com/ralouphie/mimey/blob/develop/mime.types.php

như thế này:

$mimes=include('mime.types.php'); 

hoặc sao chép nội dung:

$mime= array (
    'mimes' => 
    array (
    'ez' => 
    array (
     0 => 'application/andrew-inset', 
    ), 
    'aw' => 
    array (
     0 => 'application/applixware', 
    ), 
    'atom' => 
    array (
     0 => 'application/atom+xml', 
    ), 
    'atomcat' => 
    array (
     0 => 'application/atomcat+xml', 
    ) 

    ... 

và một ví dụ về việc từ một dòng:

$finfo = new \finfo(FILEINFO_MIME_TYPE); 
$mime=$finfo->buffer($data); 
$mimes=include(__DIR__."/mime.types.php"); 
echo ($mime); //mime 
echo ($mimes['extensions'][$mime]); // file extension 
Các vấn đề liên quan