forked from GNUsocial/gnu-social
Merge remote branch 'statusnet/1.0.x' into msn-plugin
This commit is contained in:
commit
8301a4d734
@ -180,7 +180,8 @@ class MediaFile
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$mimetype = MediaFile::getUploadedFileType($_FILES[$param]['tmp_name']);
|
$mimetype = MediaFile::getUploadedFileType($_FILES[$param]['tmp_name'],
|
||||||
|
$_FILES[$param]['name']);
|
||||||
|
|
||||||
$filename = null;
|
$filename = null;
|
||||||
|
|
||||||
@ -241,19 +242,41 @@ class MediaFile
|
|||||||
return new MediaFile($user, $filename, $mimetype);
|
return new MediaFile($user, $filename, $mimetype);
|
||||||
}
|
}
|
||||||
|
|
||||||
static function getUploadedFileType($f) {
|
/**
|
||||||
|
* Attempt to identify the content type of a given file.
|
||||||
|
*
|
||||||
|
* @param mixed $f file handle resource, or filesystem path as string
|
||||||
|
* @param string $originalFilename (optional) for extension-based detection
|
||||||
|
* @return string
|
||||||
|
*
|
||||||
|
* @fixme is this an internal or public method? It's called from GetFileAction
|
||||||
|
* @fixme this seems to tie a front-end error message in, kinda confusing
|
||||||
|
* @fixme this looks like it could return a PEAR_Error in some cases, if
|
||||||
|
* type can't be identified and $config['attachments']['supported'] is true
|
||||||
|
*
|
||||||
|
* @throws ClientException if type is known, but not supported for local uploads
|
||||||
|
*/
|
||||||
|
static function getUploadedFileType($f, $originalFilename=false) {
|
||||||
require_once 'MIME/Type.php';
|
require_once 'MIME/Type.php';
|
||||||
|
require_once 'MIME/Type/Extension.php';
|
||||||
|
$mte = new MIME_Type_Extension();
|
||||||
|
|
||||||
$cmd = &PEAR::getStaticProperty('MIME_Type', 'fileCmd');
|
$cmd = &PEAR::getStaticProperty('MIME_Type', 'fileCmd');
|
||||||
$cmd = common_config('attachments', 'filecommand');
|
$cmd = common_config('attachments', 'filecommand');
|
||||||
|
|
||||||
$filetype = null;
|
$filetype = null;
|
||||||
|
|
||||||
|
// If we couldn't get a clear type from the file extension,
|
||||||
|
// we'll go ahead and try checking the content. Content checks
|
||||||
|
// are unambiguous for most image files, but nearly useless
|
||||||
|
// for office document formats.
|
||||||
|
|
||||||
if (is_string($f)) {
|
if (is_string($f)) {
|
||||||
|
|
||||||
// assuming a filename
|
// assuming a filename
|
||||||
|
|
||||||
$filetype = MIME_Type::autoDetect($f);
|
$filetype = MIME_Type::autoDetect($f);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// assuming a filehandle
|
// assuming a filehandle
|
||||||
@ -262,7 +285,32 @@ class MediaFile
|
|||||||
$filetype = MIME_Type::autoDetect($stream['uri']);
|
$filetype = MIME_Type::autoDetect($stream['uri']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (common_config('attachments', 'supported') === true || in_array($filetype, common_config('attachments', 'supported'))) {
|
// The content-based sources for MIME_Type::autoDetect()
|
||||||
|
// are wildly unreliable for office-type documents. If we've
|
||||||
|
// gotten an unclear reponse back or just couldn't identify it,
|
||||||
|
// we'll try detecting a type from its extension...
|
||||||
|
$unclearTypes = array('application/octet-stream',
|
||||||
|
'application/vnd.ms-office',
|
||||||
|
'application/zip');
|
||||||
|
|
||||||
|
if ($originalFilename && (!$filetype || in_array($filetype, $unclearTypes))) {
|
||||||
|
$type = $mte->getMIMEType($originalFilename);
|
||||||
|
if (is_string($type)) {
|
||||||
|
$filetype = $type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$supported = common_config('attachments', 'supported');
|
||||||
|
if (is_array($supported)) {
|
||||||
|
// Normalize extensions to mime types
|
||||||
|
foreach ($supported as $i => $entry) {
|
||||||
|
if (strpos($entry, '/') === false) {
|
||||||
|
common_log(LOG_INFO, "sample.$entry");
|
||||||
|
$supported[$i] = $mte->getMIMEType("sample.$entry");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($supported === true || in_array($filetype, $supported)) {
|
||||||
return $filetype;
|
return $filetype;
|
||||||
}
|
}
|
||||||
$media = MIME_Type::getMedia($filetype);
|
$media = MIME_Type::getMedia($filetype);
|
||||||
|
96
tests/MediaFileTest.php
Normal file
96
tests/MediaFileTest.php
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
|
||||||
|
print "This script must be run from the command line\n";
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
|
||||||
|
define('STATUSNET', true);
|
||||||
|
define('LACONICA', true);
|
||||||
|
|
||||||
|
require_once INSTALLDIR . '/lib/common.php';
|
||||||
|
|
||||||
|
class MediaFileTest extends PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
|
||||||
|
public function setup()
|
||||||
|
{
|
||||||
|
$this->old_attachments_supported = common_config('attachments', 'supported');
|
||||||
|
$GLOBALS['config']['attachments']['supported'] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tearDown()
|
||||||
|
{
|
||||||
|
$GLOBALS['config']['attachments']['supported'] = $this->old_attachments_supported;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider fileTypeCases
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function testFileType($filename, $expectedType)
|
||||||
|
{
|
||||||
|
if (!file_exists($filename)) {
|
||||||
|
throw new Exception("WTF? $filename test file missing");
|
||||||
|
}
|
||||||
|
|
||||||
|
$type = MediaFile::getUploadedFileType($filename, basename($filename));
|
||||||
|
$this->assertEquals($expectedType, $type);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider fileTypeCases
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function testUploadedFileType($filename, $expectedType)
|
||||||
|
{
|
||||||
|
if (!file_exists($filename)) {
|
||||||
|
throw new Exception("WTF? $filename test file missing");
|
||||||
|
}
|
||||||
|
$tmp = tmpfile();
|
||||||
|
fwrite($tmp, file_get_contents($filename));
|
||||||
|
|
||||||
|
$type = MediaFile::getUploadedFileType($tmp, basename($filename));
|
||||||
|
$this->assertEquals($expectedType, $type);
|
||||||
|
}
|
||||||
|
|
||||||
|
static public function fileTypeCases()
|
||||||
|
{
|
||||||
|
$base = dirname(__FILE__);
|
||||||
|
$dir = "$base/sample-uploads";
|
||||||
|
$files = array(
|
||||||
|
"image.png" => "image/png",
|
||||||
|
"image.gif" => "image/gif",
|
||||||
|
"image.jpg" => "image/jpeg",
|
||||||
|
"image.jpeg" => "image/jpeg",
|
||||||
|
|
||||||
|
"office.pdf" => "application/pdf",
|
||||||
|
|
||||||
|
"wordproc.odt" => "application/vnd.oasis.opendocument.text",
|
||||||
|
"wordproc.ott" => "application/vnd.oasis.opendocument.text-template",
|
||||||
|
"wordproc.doc" => "application/msword",
|
||||||
|
"wordproc.docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
||||||
|
"wordproc.rtf" => "text/rtf",
|
||||||
|
|
||||||
|
"spreadsheet.ods" => "application/vnd.oasis.opendocument.spreadsheet",
|
||||||
|
"spreadsheet.ots" => "application/vnd.oasis.opendocument.spreadsheet-template",
|
||||||
|
"spreadsheet.xls" => "application/vnd.ms-excel",
|
||||||
|
"spreadsheet.xlt" => "application/vnd.ms-excel",
|
||||||
|
"spreadsheet.xlsx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||||||
|
|
||||||
|
"presentation.odp" => "application/vnd.oasis.opendocument.presentation",
|
||||||
|
"presentation.otp" => "application/vnd.oasis.opendocument.presentation-template",
|
||||||
|
"presentation.ppt" => "application/vnd.ms-powerpoint",
|
||||||
|
"presentation.pptx" => "application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
||||||
|
);
|
||||||
|
|
||||||
|
$dataset = array();
|
||||||
|
foreach ($files as $file => $type) {
|
||||||
|
$dataset[] = array("$dir/$file", $type);
|
||||||
|
}
|
||||||
|
return $dataset;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
BIN
tests/sample-uploads/image.gif
Normal file
BIN
tests/sample-uploads/image.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 35 B |
BIN
tests/sample-uploads/image.jpeg
Normal file
BIN
tests/sample-uploads/image.jpeg
Normal file
Binary file not shown.
After Width: | Height: | Size: 306 B |
BIN
tests/sample-uploads/image.jpg
Normal file
BIN
tests/sample-uploads/image.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 306 B |
BIN
tests/sample-uploads/image.png
Normal file
BIN
tests/sample-uploads/image.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 159 B |
BIN
tests/sample-uploads/office.pdf
Normal file
BIN
tests/sample-uploads/office.pdf
Normal file
Binary file not shown.
BIN
tests/sample-uploads/presentation.odp
Normal file
BIN
tests/sample-uploads/presentation.odp
Normal file
Binary file not shown.
BIN
tests/sample-uploads/presentation.otp
Normal file
BIN
tests/sample-uploads/presentation.otp
Normal file
Binary file not shown.
BIN
tests/sample-uploads/presentation.pot
Normal file
BIN
tests/sample-uploads/presentation.pot
Normal file
Binary file not shown.
BIN
tests/sample-uploads/presentation.potm
Normal file
BIN
tests/sample-uploads/presentation.potm
Normal file
Binary file not shown.
BIN
tests/sample-uploads/presentation.ppt
Normal file
BIN
tests/sample-uploads/presentation.ppt
Normal file
Binary file not shown.
BIN
tests/sample-uploads/presentation.pptx
Normal file
BIN
tests/sample-uploads/presentation.pptx
Normal file
Binary file not shown.
BIN
tests/sample-uploads/spreadsheet.ods
Normal file
BIN
tests/sample-uploads/spreadsheet.ods
Normal file
Binary file not shown.
BIN
tests/sample-uploads/spreadsheet.ots
Normal file
BIN
tests/sample-uploads/spreadsheet.ots
Normal file
Binary file not shown.
BIN
tests/sample-uploads/spreadsheet.xls
Normal file
BIN
tests/sample-uploads/spreadsheet.xls
Normal file
Binary file not shown.
BIN
tests/sample-uploads/spreadsheet.xlsx
Normal file
BIN
tests/sample-uploads/spreadsheet.xlsx
Normal file
Binary file not shown.
BIN
tests/sample-uploads/spreadsheet.xlt
Normal file
BIN
tests/sample-uploads/spreadsheet.xlt
Normal file
Binary file not shown.
BIN
tests/sample-uploads/wordproc.doc
Normal file
BIN
tests/sample-uploads/wordproc.doc
Normal file
Binary file not shown.
BIN
tests/sample-uploads/wordproc.docx
Normal file
BIN
tests/sample-uploads/wordproc.docx
Normal file
Binary file not shown.
BIN
tests/sample-uploads/wordproc.odt
Normal file
BIN
tests/sample-uploads/wordproc.odt
Normal file
Binary file not shown.
BIN
tests/sample-uploads/wordproc.ott
Normal file
BIN
tests/sample-uploads/wordproc.ott
Normal file
Binary file not shown.
16
tests/sample-uploads/wordproc.rtf
Normal file
16
tests/sample-uploads/wordproc.rtf
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{\rtf1\ansi\deff0\adeflang1025
|
||||||
|
{\fonttbl{\f0\froman\fprq2\fcharset128 Times New Roman;}{\f1\froman\fprq2\fcharset128 Times New Roman;}{\f2\fswiss\fprq2\fcharset128 Arial;}{\f3\fnil\fprq2\fcharset128 DejaVu Sans;}}
|
||||||
|
{\colortbl;\red0\green0\blue0;\red128\green128\blue128;}
|
||||||
|
{\stylesheet{\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\snext1 Normal;}
|
||||||
|
{\s2\sb240\sa120\keepn\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\afs28\lang1081\ltrch\dbch\langfe2052\hich\f2\fs28\lang1033\loch\f2\fs28\lang1033\sbasedon1\snext3 Heading;}
|
||||||
|
{\s3\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\sbasedon1\snext3 Body Text;}
|
||||||
|
{\s4\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\sbasedon3\snext4 List;}
|
||||||
|
{\s5\sb120\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ai\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\i\loch\f0\fs24\lang1033\i\sbasedon1\snext5 caption;}
|
||||||
|
{\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\sbasedon1\snext6 Index;}
|
||||||
|
}
|
||||||
|
{\info{\author Brion }{\creatim\yr2010\mo5\dy10\hr15\min2}{\revtim\yr0\mo0\dy0\hr0\min0}{\printim\yr0\mo0\dy0\hr0\min0}{\comment StarWriter}{\vern3200}}\deftab709
|
||||||
|
{\*\pgdsctbl
|
||||||
|
{\pgdsc0\pgdscuse195\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Standard;}}
|
||||||
|
\paperh15840\paperw12240\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
|
||||||
|
\pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033
|
||||||
|
\par }
|
Loading…
Reference in New Issue
Block a user