1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10: 11:
12:
13:
14:
15: 16: 17: 18: 19: 20:
21: final class MimeTypeDetector
22: {
23:
24: 25: 26:
27: final public function __construct()
28: {
29: throw new StaticClassException;
30: }
31:
32:
33: 34: 35: 36: 37:
38: public static function fromFile($file)
39: {
40: if (!is_file($file)) {
41: throw new FileNotFoundException("File '$file' not found.");
42: }
43:
44: $info = @getimagesize($file);
45: if (isset($info['mime'])) {
46: return $info['mime'];
47:
48: } elseif (extension_loaded('fileinfo')) {
49: $type = preg_replace('#[\s;].*\z#', '', finfo_file(finfo_open(FILEINFO_MIME), $file));
50:
51: } elseif (function_exists('mime_content_type')) {
52: $type = mime_content_type($file);
53: }
54:
55: return isset($type) && preg_match('#^\S+/\S+\z#', $type) ? $type : 'application/octet-stream';
56: }
57:
58:
59: 60: 61: 62: 63:
64: public static function fromString($data)
65: {
66: if (extension_loaded('fileinfo') && preg_match('#^(\S+/[^\s;]+)#', finfo_buffer(finfo_open(FILEINFO_MIME), $data), $m)) {
67: return $m[1];
68:
69: } elseif (strncmp($data, "\xff\xd8", 2) === 0) {
70: return 'image/jpeg';
71:
72: } elseif (strncmp($data, "\x89PNG", 4) === 0) {
73: return 'image/png';
74:
75: } elseif (strncmp($data, "GIF", 3) === 0) {
76: return 'image/gif';
77:
78: } else {
79: return 'application/octet-stream';
80: }
81: }
82:
83: }
84: