Skip to content

Commit faf30fd

Browse files
committed
Fixes #964: specify mime-type for epub files
1 parent 9386fec commit faf30fd

File tree

2 files changed

+170
-168
lines changed

2 files changed

+170
-168
lines changed

src/Util/MimeType.php

Lines changed: 163 additions & 168 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,165 @@
1010
*/
1111
class MimeType
1212
{
13+
private static $extensionToMimeTypeMap = [
14+
'hqx' => 'application/mac-binhex40',
15+
'cpt' => 'application/mac-compactpro',
16+
'csv' => 'text/x-comma-separated-values',
17+
'bin' => 'application/octet-stream',
18+
'dms' => 'application/octet-stream',
19+
'lha' => 'application/octet-stream',
20+
'lzh' => 'application/octet-stream',
21+
'exe' => 'application/octet-stream',
22+
'class' => 'application/octet-stream',
23+
'psd' => 'application/x-photoshop',
24+
'so' => 'application/octet-stream',
25+
'sea' => 'application/octet-stream',
26+
'dll' => 'application/octet-stream',
27+
'oda' => 'application/oda',
28+
'pdf' => 'application/pdf',
29+
'ai' => 'application/pdf',
30+
'eps' => 'application/postscript',
31+
'ebup' => 'application/epub+zip',
32+
'ps' => 'application/postscript',
33+
'smi' => 'application/smil',
34+
'smil' => 'application/smil',
35+
'mif' => 'application/vnd.mif',
36+
'xls' => 'application/vnd.ms-excel',
37+
'ppt' => 'application/powerpoint',
38+
'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
39+
'wbxml' => 'application/wbxml',
40+
'wmlc' => 'application/wmlc',
41+
'dcr' => 'application/x-director',
42+
'dir' => 'application/x-director',
43+
'dxr' => 'application/x-director',
44+
'dvi' => 'application/x-dvi',
45+
'gtar' => 'application/x-gtar',
46+
'gz' => 'application/x-gzip',
47+
'gzip' => 'application/x-gzip',
48+
'php' => 'application/x-httpd-php',
49+
'php4' => 'application/x-httpd-php',
50+
'php3' => 'application/x-httpd-php',
51+
'phtml' => 'application/x-httpd-php',
52+
'phps' => 'application/x-httpd-php-source',
53+
'js' => 'application/javascript',
54+
'swf' => 'application/x-shockwave-flash',
55+
'sit' => 'application/x-stuffit',
56+
'tar' => 'application/x-tar',
57+
'tgz' => 'application/x-tar',
58+
'z' => 'application/x-compress',
59+
'xhtml' => 'application/xhtml+xml',
60+
'xht' => 'application/xhtml+xml',
61+
'zip' => 'application/x-zip',
62+
'rar' => 'application/x-rar',
63+
'mid' => 'audio/midi',
64+
'midi' => 'audio/midi',
65+
'mpga' => 'audio/mpeg',
66+
'mp2' => 'audio/mpeg',
67+
'mp3' => 'audio/mpeg',
68+
'aif' => 'audio/x-aiff',
69+
'aiff' => 'audio/x-aiff',
70+
'aifc' => 'audio/x-aiff',
71+
'ram' => 'audio/x-pn-realaudio',
72+
'rm' => 'audio/x-pn-realaudio',
73+
'rpm' => 'audio/x-pn-realaudio-plugin',
74+
'ra' => 'audio/x-realaudio',
75+
'rv' => 'video/vnd.rn-realvideo',
76+
'wav' => 'audio/x-wav',
77+
'jpg' => 'image/jpeg',
78+
'jpeg' => 'image/jpeg',
79+
'jpe' => 'image/jpeg',
80+
'png' => 'image/png',
81+
'gif' => 'image/gif',
82+
'bmp' => 'image/bmp',
83+
'tiff' => 'image/tiff',
84+
'tif' => 'image/tiff',
85+
'svg' => 'image/svg+xml',
86+
'css' => 'text/css',
87+
'html' => 'text/html',
88+
'htm' => 'text/html',
89+
'shtml' => 'text/html',
90+
'txt' => 'text/plain',
91+
'text' => 'text/plain',
92+
'log' => 'text/plain',
93+
'rtx' => 'text/richtext',
94+
'rtf' => 'text/rtf',
95+
'xml' => 'application/xml',
96+
'xsl' => 'application/xml',
97+
'dmn' => 'application/octet-stream',
98+
'bpmn' => 'application/octet-stream',
99+
'mpeg' => 'video/mpeg',
100+
'mpg' => 'video/mpeg',
101+
'mpe' => 'video/mpeg',
102+
'qt' => 'video/quicktime',
103+
'mov' => 'video/quicktime',
104+
'avi' => 'video/x-msvideo',
105+
'movie' => 'video/x-sgi-movie',
106+
'doc' => 'application/msword',
107+
'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
108+
'docm' => 'application/vnd.ms-word.template.macroEnabled.12',
109+
'dot' => 'application/msword',
110+
'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
111+
'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
112+
'word' => 'application/msword',
113+
'xl' => 'application/excel',
114+
'eml' => 'message/rfc822',
115+
'json' => 'application/json',
116+
'pem' => 'application/x-x509-user-cert',
117+
'p10' => 'application/x-pkcs10',
118+
'p12' => 'application/x-pkcs12',
119+
'p7a' => 'application/x-pkcs7-signature',
120+
'p7c' => 'application/pkcs7-mime',
121+
'p7m' => 'application/pkcs7-mime',
122+
'p7r' => 'application/x-pkcs7-certreqresp',
123+
'p7s' => 'application/pkcs7-signature',
124+
'crt' => 'application/x-x509-ca-cert',
125+
'crl' => 'application/pkix-crl',
126+
'der' => 'application/x-x509-ca-cert',
127+
'kdb' => 'application/octet-stream',
128+
'pgp' => 'application/pgp',
129+
'gpg' => 'application/gpg-keys',
130+
'sst' => 'application/octet-stream',
131+
'csr' => 'application/octet-stream',
132+
'rsa' => 'application/x-pkcs7',
133+
'cer' => 'application/pkix-cert',
134+
'3g2' => 'video/3gpp2',
135+
'3gp' => 'video/3gp',
136+
'mp4' => 'video/mp4',
137+
'm4a' => 'audio/x-m4a',
138+
'f4v' => 'video/mp4',
139+
'webm' => 'video/webm',
140+
'aac' => 'audio/x-acc',
141+
'm4u' => 'application/vnd.mpegurl',
142+
'm3u' => 'text/plain',
143+
'xspf' => 'application/xspf+xml',
144+
'vlc' => 'application/videolan',
145+
'wmv' => 'video/x-ms-wmv',
146+
'au' => 'audio/x-au',
147+
'ac3' => 'audio/ac3',
148+
'flac' => 'audio/x-flac',
149+
'ogg' => 'audio/ogg',
150+
'kmz' => 'application/vnd.google-earth.kmz',
151+
'kml' => 'application/vnd.google-earth.kml+xml',
152+
'ics' => 'text/calendar',
153+
'zsh' => 'text/x-scriptzsh',
154+
'7zip' => 'application/x-7z-compressed',
155+
'cdr' => 'application/cdr',
156+
'wma' => 'audio/x-ms-wma',
157+
'jar' => 'application/java-archive',
158+
'tex' => 'application/x-tex',
159+
'latex' => 'application/x-latex',
160+
'odt' => 'application/vnd.oasis.opendocument.text',
161+
'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
162+
'odp' => 'application/vnd.oasis.opendocument.presentation',
163+
'odg' => 'application/vnd.oasis.opendocument.graphics',
164+
'odc' => 'application/vnd.oasis.opendocument.chart',
165+
'odf' => 'application/vnd.oasis.opendocument.formula',
166+
'odi' => 'application/vnd.oasis.opendocument.image',
167+
'odm' => 'application/vnd.oasis.opendocument.text-master',
168+
'odb' => 'application/vnd.oasis.opendocument.database',
169+
'ott' => 'application/vnd.oasis.opendocument.text-template',
170+
];
171+
13172
/**
14173
* Detects MIME Type based on given content.
15174
*
@@ -41,17 +200,9 @@ public static function detectByContent($content)
41200
*/
42201
public static function detectByFileExtension($extension)
43202
{
44-
static $extensionToMimeTypeMap;
45-
46-
if (! $extensionToMimeTypeMap) {
47-
$extensionToMimeTypeMap = static::getExtensionToMimeTypeMap();
48-
}
49-
50-
if (isset($extensionToMimeTypeMap[$extension])) {
51-
return $extensionToMimeTypeMap[$extension];
52-
}
53-
54-
return 'text/plain';
203+
return isset(static::$extensionToMimeTypeMap[$extension])
204+
? static::$extensionToMimeTypeMap[$extension]
205+
: 'text/plain';
55206
}
56207

57208
/**
@@ -71,162 +222,6 @@ public static function detectByFilename($filename)
71222
*/
72223
public static function getExtensionToMimeTypeMap()
73224
{
74-
return [
75-
'hqx' => 'application/mac-binhex40',
76-
'cpt' => 'application/mac-compactpro',
77-
'csv' => 'text/x-comma-separated-values',
78-
'bin' => 'application/octet-stream',
79-
'dms' => 'application/octet-stream',
80-
'lha' => 'application/octet-stream',
81-
'lzh' => 'application/octet-stream',
82-
'exe' => 'application/octet-stream',
83-
'class' => 'application/octet-stream',
84-
'psd' => 'application/x-photoshop',
85-
'so' => 'application/octet-stream',
86-
'sea' => 'application/octet-stream',
87-
'dll' => 'application/octet-stream',
88-
'oda' => 'application/oda',
89-
'pdf' => 'application/pdf',
90-
'ai' => 'application/pdf',
91-
'eps' => 'application/postscript',
92-
'ps' => 'application/postscript',
93-
'smi' => 'application/smil',
94-
'smil' => 'application/smil',
95-
'mif' => 'application/vnd.mif',
96-
'xls' => 'application/vnd.ms-excel',
97-
'ppt' => 'application/powerpoint',
98-
'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
99-
'wbxml' => 'application/wbxml',
100-
'wmlc' => 'application/wmlc',
101-
'dcr' => 'application/x-director',
102-
'dir' => 'application/x-director',
103-
'dxr' => 'application/x-director',
104-
'dvi' => 'application/x-dvi',
105-
'gtar' => 'application/x-gtar',
106-
'gz' => 'application/x-gzip',
107-
'gzip' => 'application/x-gzip',
108-
'php' => 'application/x-httpd-php',
109-
'php4' => 'application/x-httpd-php',
110-
'php3' => 'application/x-httpd-php',
111-
'phtml' => 'application/x-httpd-php',
112-
'phps' => 'application/x-httpd-php-source',
113-
'js' => 'application/javascript',
114-
'swf' => 'application/x-shockwave-flash',
115-
'sit' => 'application/x-stuffit',
116-
'tar' => 'application/x-tar',
117-
'tgz' => 'application/x-tar',
118-
'z' => 'application/x-compress',
119-
'xhtml' => 'application/xhtml+xml',
120-
'xht' => 'application/xhtml+xml',
121-
'zip' => 'application/x-zip',
122-
'rar' => 'application/x-rar',
123-
'mid' => 'audio/midi',
124-
'midi' => 'audio/midi',
125-
'mpga' => 'audio/mpeg',
126-
'mp2' => 'audio/mpeg',
127-
'mp3' => 'audio/mpeg',
128-
'aif' => 'audio/x-aiff',
129-
'aiff' => 'audio/x-aiff',
130-
'aifc' => 'audio/x-aiff',
131-
'ram' => 'audio/x-pn-realaudio',
132-
'rm' => 'audio/x-pn-realaudio',
133-
'rpm' => 'audio/x-pn-realaudio-plugin',
134-
'ra' => 'audio/x-realaudio',
135-
'rv' => 'video/vnd.rn-realvideo',
136-
'wav' => 'audio/x-wav',
137-
'jpg' => 'image/jpeg',
138-
'jpeg' => 'image/jpeg',
139-
'jpe' => 'image/jpeg',
140-
'png' => 'image/png',
141-
'gif' => 'image/gif',
142-
'bmp' => 'image/bmp',
143-
'tiff' => 'image/tiff',
144-
'tif' => 'image/tiff',
145-
'svg' => 'image/svg+xml',
146-
'css' => 'text/css',
147-
'html' => 'text/html',
148-
'htm' => 'text/html',
149-
'shtml' => 'text/html',
150-
'txt' => 'text/plain',
151-
'text' => 'text/plain',
152-
'log' => 'text/plain',
153-
'rtx' => 'text/richtext',
154-
'rtf' => 'text/rtf',
155-
'xml' => 'application/xml',
156-
'xsl' => 'application/xml',
157-
'dmn' => 'application/octet-stream',
158-
'bpmn' => 'application/octet-stream',
159-
'mpeg' => 'video/mpeg',
160-
'mpg' => 'video/mpeg',
161-
'mpe' => 'video/mpeg',
162-
'qt' => 'video/quicktime',
163-
'mov' => 'video/quicktime',
164-
'avi' => 'video/x-msvideo',
165-
'movie' => 'video/x-sgi-movie',
166-
'doc' => 'application/msword',
167-
'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
168-
'docm' => 'application/vnd.ms-word.template.macroEnabled.12',
169-
'dot' => 'application/msword',
170-
'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
171-
'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
172-
'word' => 'application/msword',
173-
'xl' => 'application/excel',
174-
'eml' => 'message/rfc822',
175-
'json' => 'application/json',
176-
'pem' => 'application/x-x509-user-cert',
177-
'p10' => 'application/x-pkcs10',
178-
'p12' => 'application/x-pkcs12',
179-
'p7a' => 'application/x-pkcs7-signature',
180-
'p7c' => 'application/pkcs7-mime',
181-
'p7m' => 'application/pkcs7-mime',
182-
'p7r' => 'application/x-pkcs7-certreqresp',
183-
'p7s' => 'application/pkcs7-signature',
184-
'crt' => 'application/x-x509-ca-cert',
185-
'crl' => 'application/pkix-crl',
186-
'der' => 'application/x-x509-ca-cert',
187-
'kdb' => 'application/octet-stream',
188-
'pgp' => 'application/pgp',
189-
'gpg' => 'application/gpg-keys',
190-
'sst' => 'application/octet-stream',
191-
'csr' => 'application/octet-stream',
192-
'rsa' => 'application/x-pkcs7',
193-
'cer' => 'application/pkix-cert',
194-
'3g2' => 'video/3gpp2',
195-
'3gp' => 'video/3gp',
196-
'mp4' => 'video/mp4',
197-
'm4a' => 'audio/x-m4a',
198-
'f4v' => 'video/mp4',
199-
'webm' => 'video/webm',
200-
'aac' => 'audio/x-acc',
201-
'm4u' => 'application/vnd.mpegurl',
202-
'm3u' => 'text/plain',
203-
'xspf' => 'application/xspf+xml',
204-
'vlc' => 'application/videolan',
205-
'wmv' => 'video/x-ms-wmv',
206-
'au' => 'audio/x-au',
207-
'ac3' => 'audio/ac3',
208-
'flac' => 'audio/x-flac',
209-
'ogg' => 'audio/ogg',
210-
'kmz' => 'application/vnd.google-earth.kmz',
211-
'kml' => 'application/vnd.google-earth.kml+xml',
212-
'ics' => 'text/calendar',
213-
'zsh' => 'text/x-scriptzsh',
214-
'7zip' => 'application/x-7z-compressed',
215-
'cdr' => 'application/cdr',
216-
'wma' => 'audio/x-ms-wma',
217-
'jar' => 'application/java-archive',
218-
'tex' => 'application/x-tex',
219-
'latex' => 'application/x-latex',
220-
'odt' => 'application/vnd.oasis.opendocument.text',
221-
'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
222-
'odp' => 'application/vnd.oasis.opendocument.presentation',
223-
'odg' => 'application/vnd.oasis.opendocument.graphics',
224-
'odc' => 'application/vnd.oasis.opendocument.chart',
225-
'odf' => 'application/vnd.oasis.opendocument.formula',
226-
'odi' => 'application/vnd.oasis.opendocument.image',
227-
'odm' => 'application/vnd.oasis.opendocument.text-master',
228-
'odb' => 'application/vnd.oasis.opendocument.database',
229-
'ott' => 'application/vnd.oasis.opendocument.text-template',
230-
];
225+
return static::$extensionToMimeTypeMap;
231226
}
232227
}

tests/UtilMimeTests.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,13 @@ public function testNoFinfoFallback()
2929
$passthru = true;
3030
}
3131

32+
public function testRetrievingAllMimetypes()
33+
{
34+
$map = MimeType::getExtensionToMimeTypeMap();
35+
$this->assertInternalType('array', $map);
36+
$this->assertEquals('application/epub+zip', $map['epub']);
37+
}
38+
3239
public function testNoExtension()
3340
{
3441
$this->assertEquals('text/plain', MimeType::detectByFileExtension('dir/file'));

0 commit comments

Comments
 (0)