Merge pull request #432 from silverstripe-scienceninjas/mimetypes

API CHANGE: Do not rely on a specific OS mime type detection, use PHP fi...
This commit is contained in:
Sam Minnée 2012-05-10 16:51:23 -07:00
commit 448b2141fd
13 changed files with 40 additions and 391 deletions

View File

@ -181,47 +181,25 @@ class HTTP {
return self::findByTagAndAttribute($content, array("img" => "src"));
}
/*
/**
* Get mime type based on extension
*
* @uses finfo
* @deprecated Use HTTP::get_mime_type() instead
*/
static function getMimeType($filename) {
global $global_mimetypes;
if(!$global_mimetypes) self::loadMimeTypes();
$ext = strtolower(substr($filename,strrpos($filename,'.')+1));
if(isset($global_mimetypes[$ext])) return $global_mimetypes[$ext];
public static function getMimeType($filename) {
Deprecation::notice('3.0', 'Use HTTP::get_mime_type() instead.');
self::get_mime_type($filename);
}
/*
* Load the mime-type data from the system file
/**
* Get mime type based on extension
*
* @uses finfo
*/
static function loadMimeTypes() {
if(@file_exists('/etc/mime.types')) {
$mimeTypes = file('/etc/mime.types');
foreach($mimeTypes as $typeSpec) {
if(($typeSpec = trim($typeSpec)) && substr($typeSpec,0,1) != "#") {
$parts = preg_split("/[ \t\r\n]+/", $typeSpec);
if(sizeof($parts) > 1) {
$mimeType = array_shift($parts);
foreach($parts as $ext) {
$ext = strtolower($ext);
$mimeData[$ext] = $mimeType;
}
}
}
}
// Fail-over for if people don't have /etc/mime.types on their server. it's unclear how important this actually is
} else {
$mimeData = array(
"doc" => "application/msword",
"xls" => "application/vnd.ms-excel",
"rtf" => "application/rtf",
);
}
global $global_mimetypes;
$global_mimetypes = $mimeData;
return $mimeData;
public static function get_mime_type($filename) {
$finfo = new finfo(FILEINFO_MIME_TYPE);
return $finfo->file(BASE_PATH.DIRECTORY_SEPARATOR.$filename);
}
/**

View File

@ -284,8 +284,9 @@ class SS_HTTPRequest implements ArrayAccess {
* Construct an SS_HTTPResponse that will deliver a file to the client
*/
static function send_file($fileData, $fileName, $mimeType = null) {
if(!$mimeType) $mimeType = HTTP::getMimeType($fileName);
if(!$mimeType) {
$mimeType = HTTP::get_mime_type($fileName);
}
$response = new SS_HTTPResponse($fileData);
$response->addHeader("Content-Type", "$mimeType; name=\"" . addslashes($fileName) . "\"");
$response->addHeader("Content-disposition", "attachment; filename=" . addslashes($fileName));

View File

@ -377,9 +377,8 @@ function encodeFileForEmail($file, $destFileName = false, $disposition = NULL, $
if(!$destFileName) $base = basename($file['filename']);
else $base = $destFileName;
$mimeType = $file['mimetype'] ? $file['mimetype'] : getMimeType($file['filename']);
$mimeType = $file['mimetype'] ? $file['mimetype'] : HTTP::get_mime_type($file['filename']);
if(!$mimeType) $mimeType = "application/unknown";
if (empty($disposition)) $disposition = isset($file['contentLocation']) ? 'inline' : 'attachment';
// Encode for emailing
@ -431,38 +430,3 @@ function validEmailAddr($emailAddress) {
return $emailAddress;
}
/*
* Get mime type based on extension
*/
function getMimeType($filename) {
global $global_mimetypes;
if(!$global_mimetypes) loadMimeTypes();
$ext = strtolower(substr($filename,strrpos($filename,'.')+1));
return $global_mimetypes[$ext];
}
/*
* Load the mime-type data from the system file
*/
function loadMimeTypes() {
$mimetypePathCustom = '/etc/mime.types';
$mimetypePathGeneric = FRAMEWORK_PATH . '/email/mime.types';
$mimeTypes = file_exists($mimetypePathGeneric) ? file($mimetypePathGeneric) : file($mimetypePathCustom);
foreach($mimeTypes as $typeSpec) {
if(($typeSpec = trim($typeSpec)) && substr($typeSpec,0,1) != "#") {
$parts = preg_split("/[ \t\r\n]+/", $typeSpec);
if(sizeof($parts) > 1) {
$mimeType = array_shift($parts);
foreach($parts as $ext) {
$ext = strtolower($ext);
$mimeData[$ext] = $mimeType;
}
}
}
}
global $global_mimetypes;
$global_mimetypes = $mimeData;
return $mimeData;
}

View File

@ -1,314 +0,0 @@
application/andrew-inset ez
application/cu-seeme cu
application/dsptype tsp
application/futuresplash spl
application/hta hta
application/java-archive jar
application/java-serialized-object ser
application/java-vm class
application/mac-binhex40 hqx
application/mac-compactpro cpt
application/mathematica nb
application/msaccess mdb
application/msword doc dot docx docm dotx dotm
application/octet-stream bin
application/oda oda
application/ogg ogg
application/pdf pdf
application/pgp-keys key
application/pgp-signature pgp
application/pics-rules prf
application/postscript ps ai eps
application/rar rar
application/rdf+xml rdf
application/rss+xml rss
application/smil smi smil
application/wordperfect wpd
application/wordperfect5.1 wp5
application/xhtml+xml xhtml xht
application/xml xml xsl
application/zip zip
application/vnd.mozilla.xul+xml xul
application/vnd.ms-excel xls xlb xlt xlsx xlsm xltx xltm xlsb xlam
application/vnd.ms-pki.seccat cat
application/vnd.ms-pki.stl stl
application/vnd.ms-powerpoint ppt pps pptx pptm potx potm ppam ppsx ppsm sldx sldm thmx
application/vnd.oasis.opendocument.chart odc
application/vnd.oasis.opendocument.database odb
application/vnd.oasis.opendocument.formula odf
application/vnd.oasis.opendocument.graphics odg
application/vnd.oasis.opendocument.graphics-template otg
application/vnd.oasis.opendocument.image odi
application/vnd.oasis.opendocument.presentation odp
application/vnd.oasis.opendocument.presentation-template otp
application/vnd.oasis.opendocument.spreadsheet ods
application/vnd.oasis.opendocument.spreadsheet-template ots
application/vnd.oasis.opendocument.text odt
application/vnd.oasis.opendocument.text-master odm
application/vnd.oasis.opendocument.text-template ott
application/vnd.oasis.opendocument.text-web oth
application/vnd.rim.cod cod
application/vnd.smaf mmf
application/vnd.stardivision.calc sdc
application/vnd.stardivision.draw sda
application/vnd.stardivision.impress sdd sdp
application/vnd.stardivision.math smf
application/vnd.stardivision.writer sdw vor
application/vnd.stardivision.writer-global sgl
application/vnd.sun.xml.calc sxc
application/vnd.sun.xml.calc.template stc
application/vnd.sun.xml.draw sxd
application/vnd.sun.xml.draw.template std
application/vnd.sun.xml.impress sxi
application/vnd.sun.xml.impress.template sti
application/vnd.sun.xml.math sxm
application/vnd.sun.xml.writer sxw
application/vnd.sun.xml.writer.global sxg
application/vnd.sun.xml.writer.template stw
application/vnd.symbian.install sis
application/vnd.visio vsd
application/vnd.wap.wbxml wbxml
application/vnd.wap.wmlc wmlc
application/vnd.wap.wmlscriptc wmlsc
application/x-123 wk
application/x-abiword abw
application/x-apple-diskimage dmg
application/x-bcpio bcpio
application/x-bittorrent torrent
application/x-cdf cdf
application/x-cdlink vcd
application/x-chess-pgn pgn
application/x-core
application/x-cpio cpio
application/x-csh csh
application/x-debian-package deb udeb
application/x-director dcr dir dxr
application/x-dms dms
application/x-doom wad
application/x-dvi dvi
application/x-flac flac
application/x-font pfa pfb gsf pcf pcf.Z
application/x-freemind mm
application/x-futuresplash spl
application/x-gnumeric gnumeric
application/x-go-sgf sgf
application/x-graphing-calculator gcf
application/x-gtar gtar tgz taz
application/x-hdf hdf
application/x-ica ica
application/x-internet-signup ins isp
application/x-iphone iii
application/x-iso9660-image iso
application/x-java-jnlp-file jnlp
application/x-javascript js
application/x-jmol jmz
application/x-kchart chrt
application/x-killustrator kil
application/x-koan skp skd skt skm
application/x-kpresenter kpr kpt
application/x-kspread ksp
application/x-kword kwd kwt
application/x-latex latex
application/x-lha lha
application/x-lzh lzh
application/x-lzx lzx
application/x-maker frm maker frame fm fb book fbdoc
application/x-mif mif
application/x-ms-wmd wmd
application/x-ms-wmz wmz
application/x-msdos-program com exe bat dll
application/x-msi msi
application/x-netcdf nc
application/x-ns-proxy-autoconfig pac
application/x-nwc nwc
application/x-object o
application/x-oz-application oza
application/x-pkcs7-certreqresp p7r
application/x-pkcs7-crl crl
application/x-python-code pyc pyo
application/x-quicktimeplayer qtl
application/x-redhat-package-manager rpm
application/x-sh sh
application/x-shar shar
application/x-shellscript
application/x-shockwave-flash swf swfl
application/x-stuffit sit
application/x-sv4cpio sv4cpio
application/x-sv4crc sv4crc
application/x-tar tar
application/x-tcl tcl
application/x-tex-gf gf
application/x-tex-pk pk
application/x-texinfo texinfo texi
application/x-trash ~ % bak old sik
application/x-troff t tr roff
application/x-troff-man man
application/x-troff-me me
application/x-troff-ms ms
application/x-ustar ustar
application/x-wais-source src
application/x-wingz wz
application/x-x509-ca-cert crt
application/x-xcf xcf
application/x-xfig fig
application/x-xpinstall xpi
audio/basic au snd
audio/midi mid midi kar
audio/mpeg mpga mpega mp2 mp3 m4a
audio/mpegurl m3u
audio/prs.sid sid
audio/x-aiff aif aiff aifc
audio/x-gsm gsm
audio/x-mpegurl m3u
audio/x-ms-wma wma
audio/x-ms-wax wax
audio/x-pn-realaudio-plugin
audio/x-pn-realaudio ra rm ram
audio/x-realaudio ra
audio/x-scpls pls
audio/x-sd2 sd2
audio/x-wav wav
chemical/x-alchemy alc
chemical/x-cache cac cache
chemical/x-cache-csf csf
chemical/x-cactvs-binary cbin cascii ctab
chemical/x-cdx cdx
chemical/x-cerius cer
chemical/x-chem3d c3d
chemical/x-chemdraw chm
chemical/x-cif cif
chemical/x-cmdf cmdf
chemical/x-cml cml
chemical/x-compass cpa
chemical/x-crossfire bsd
chemical/x-csml csml csm
chemical/x-ctx ctx
chemical/x-cxf cxf cef
#chemical/x-daylight-smiles smi
chemical/x-embl-dl-nucleotide emb embl
chemical/x-galactic-spc spc
chemical/x-gamess-input inp gam gamin
chemical/x-gaussian-checkpoint fch fchk
chemical/x-gaussian-cube cub
chemical/x-gaussian-input gau gjc gjf
chemical/x-gaussian-log gal
chemical/x-gcg8-sequence gcg
chemical/x-genbank gen
chemical/x-hin hin
chemical/x-isostar istr ist
chemical/x-jcamp-dx jdx dx
chemical/x-kinemage kin
chemical/x-macmolecule mcm
chemical/x-macromodel-input mmd mmod
chemical/x-mdl-molfile mol
chemical/x-mdl-rdfile rd
chemical/x-mdl-rxnfile rxn
chemical/x-mdl-sdfile sd sdf
chemical/x-mdl-tgf tgf
#chemical/x-mif mif
chemical/x-mmcif mcif
chemical/x-mol2 mol2
chemical/x-molconn-Z b
chemical/x-mopac-graph gpt
chemical/x-mopac-input mop mopcrt mpc dat zmt
chemical/x-mopac-out moo
chemical/x-mopac-vib mvb
chemical/x-ncbi-asn1 asn
chemical/x-ncbi-asn1-ascii prt ent
chemical/x-ncbi-asn1-binary val aso
chemical/x-ncbi-asn1-spec asn
chemical/x-pdb pdb ent
chemical/x-rosdal ros
chemical/x-swissprot sw
chemical/x-vamas-iso14976 vms
chemical/x-vmd vmd
chemical/x-xtel xtel
chemical/x-xyz xyz
image/gif gif
image/ief ief
image/jpeg jpeg jpg jpe
image/pcx pcx
image/png png
image/svg+xml svg svgz
image/tiff tiff tif
image/vnd.djvu djvu djv
image/vnd.wap.wbmp wbmp
image/x-cmu-raster ras
image/x-coreldraw cdr
image/x-coreldrawpattern pat
image/x-coreldrawtemplate cdt
image/x-corelphotopaint cpt
image/x-icon ico
image/x-jg art
image/x-jng jng
image/x-ms-bmp bmp
image/x-photoshop psd
image/x-portable-anymap pnm
image/x-portable-bitmap pbm
image/x-portable-graymap pgm
image/x-portable-pixmap ppm
image/x-rgb rgb
image/x-xbitmap xbm
image/x-xpixmap xpm
image/x-xwindowdump xwd
model/iges igs iges
model/mesh msh mesh silo
model/vrml wrl vrml
text/calendar ics icz
text/comma-separated-values csv
text/css css
text/h323 323
text/html html htm shtml
text/iuls uls
text/mathml mml
text/plain asc txt text diff pot
text/x-psp psp
text/richtext rtx
text/rtf rtf
text/scriptlet sct wsc
text/texmacs tm ts
text/tab-separated-values tsv
text/vnd.sun.j2me.app-descriptor jad
text/vnd.wap.wml wml
text/vnd.wap.wmlscript wmls
text/x-bibtex bib
text/x-c++hdr h++ hpp hxx hh
text/x-c++src c++ cpp cxx cc
text/x-chdr h
text/x-csh csh
text/x-csrc c
text/x-haskell hs
text/x-java java
text/x-literate-haskell lhs
text/x-moc moc
text/x-pascal p pas
text/x-pcs-gcd gcd
text/x-perl pl pm
text/x-python py
text/x-server-parsed-html
text/x-setext etx
text/x-sh sh
text/x-tcl tcl tk
text/x-tex tex ltx sty cls
text/x-vcalendar vcs
text/x-vcard vcf
video/dl dl
video/dv dif dv
video/fli fli
video/gl gl
video/mp4 mp4
video/mpeg mpeg mpg mpe
video/quicktime qt mov
video/vnd.mpegurl mxu
video/x-la-asf lsf lsx
video/x-mng mng
video/x-ms-asf asf asx
video/x-ms-wm wm
video/x-ms-wmv wmv
video/x-ms-wmx wmx
video/x-ms-wvx wvx
video/x-msvideo avi
video/x-sgi-movie movie
video/x-flv flv
x-conference/x-cooltalk ice
x-world/x-vrml vrm vrml wrl

View File

@ -106,4 +106,18 @@ class HTTPTest extends SapphireTest {
}
}
/**
* Test that the the get_mime_type() works correctly
*
*/
public function testGetMimeType() {
$this->assertEquals('text/plain', HTTP::get_mime_type(FRAMEWORK_DIR.'/tests/control/files/file.csv'));
$this->assertEquals('image/gif', HTTP::get_mime_type(FRAMEWORK_DIR.'/tests/control/files/file.gif'));
$this->assertEquals('text/html', HTTP::get_mime_type(FRAMEWORK_DIR.'/tests/control/files/file.html'));
$this->assertEquals('image/jpeg', HTTP::get_mime_type(FRAMEWORK_DIR.'/tests/control/files/file.jpg'));
$this->assertEquals('image/png', HTTP::get_mime_type(FRAMEWORK_DIR.'/tests/control/files/file.png'));
$this->assertEquals('image/vnd.adobe.photoshop', HTTP::get_mime_type(FRAMEWORK_DIR.'/tests/control/files/file.psd'));
$this->assertEquals('audio/x-wav', HTTP::get_mime_type(FRAMEWORK_DIR.'/tests/control/files/file.wav'));
$this->assertEquals('application/vnd.ms-office', HTTP::get_mime_type(FRAMEWORK_DIR.'/tests/control/files/file.xls'));
}
}

View File

@ -0,0 +1 @@
"Today","Your email","How do you feel","This is the name of the field","Submitted"
1 Today Your email How do you feel This is the name of the field Submitted

View File

Before

Width:  |  Height:  |  Size: 301 B

After

Width:  |  Height:  |  Size: 301 B

View File

@ -0,0 +1,5 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
<head></head>
<body></body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.