mirror of
https://github.com/e107inc/e107.git
synced 2025-01-17 04:38:27 +01:00
Issue #4270 WebP support in Media Manager
This commit is contained in:
parent
ca1df9d4f3
commit
25c1592e8a
@ -401,11 +401,11 @@ class e_file
|
||||
* @param boolean $auto_fix_ext
|
||||
* @return array|bool
|
||||
*/
|
||||
function get_file_info($path_to_file, $imgcheck = true, $auto_fix_ext = true)
|
||||
public function get_file_info($path_to_file, $imgcheck = true, $auto_fix_ext = true)
|
||||
{
|
||||
$finfo = array();
|
||||
|
||||
if(filesize($path_to_file) < 2) // Don't try and read 0 byte files.
|
||||
if(!file_exists($path_to_file) || filesize($path_to_file) < 2) // Don't try and read 0 byte files.
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -38,7 +38,7 @@ class e_media
|
||||
'multipart' => array(),
|
||||
'application' => array('zip','doc','gz'),
|
||||
'audio' => array('mp3','wav'),
|
||||
'image' => array('jpeg','jpg','png','gif', 'svg'),
|
||||
'image' => array('jpeg','jpg','png','gif', 'svg', 'webp'),
|
||||
'video' => array('mp4', 'youtube','youtubepl'),
|
||||
'other' => array(),
|
||||
// 'glyph' => array('glyph')
|
||||
@ -568,6 +568,7 @@ class e_media
|
||||
$id = $row['media_id'];
|
||||
$ret[$id] = $row;
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
@ -1128,7 +1129,7 @@ class e_media
|
||||
list($pmime,$tmp) = explode('/',$mime);
|
||||
unset($tmp);
|
||||
|
||||
if(!vartrue($this->mimePaths[$pmime]))
|
||||
if(empty($this->mimePaths[$pmime]))
|
||||
{
|
||||
$this->log("Couldn't detect mime-type ($mime).");
|
||||
$text = $text = str_replace('[x]',$mime,IMALAN_111); //FIXME LAN IMALAN_112 is not generic. This method can be called from anywhere, not only e107_admin/image.php.
|
||||
@ -1263,7 +1264,7 @@ class e_media
|
||||
|
||||
$info = e107::getFile()->get_file_info($path);
|
||||
|
||||
|
||||
|
||||
|
||||
$this->log("File info for $path : ".print_r($info,true));
|
||||
|
||||
@ -1443,10 +1444,11 @@ class e_media
|
||||
return $path;
|
||||
}
|
||||
|
||||
|
||||
$ext = e107::getFile()->getFileExtension($mime);
|
||||
|
||||
if($ext && (substr($path,-4) != $ext))
|
||||
$len = strlen($ext);
|
||||
|
||||
if($ext && (substr($path,- $len) != $ext))
|
||||
{
|
||||
return $path.$ext;
|
||||
}
|
||||
@ -1999,7 +2001,6 @@ class e_media
|
||||
if(!file_exists($jpgFile))
|
||||
{
|
||||
|
||||
|
||||
switch($type)
|
||||
{
|
||||
case ".gif":
|
||||
@ -2061,13 +2062,13 @@ class e_media
|
||||
$fileName = $_FILES['file']['name'];
|
||||
}
|
||||
|
||||
|
||||
// Clean the fileName for security reasons
|
||||
$fileName = preg_replace('/[^\w\._]+/', '_', $fileName);
|
||||
|
||||
// $array = array("jsonrpc" => "2.0", "error" => array('code'=>$_FILES['file']['error'], 'message'=>'Failed to move file'), "id" => "id", 'data'=>$_FILES );
|
||||
|
||||
|
||||
|
||||
// Make sure the fileName is unique but only if chunking is disabled
|
||||
if($chunks < 2 && file_exists($targetDir . $fileName))
|
||||
{
|
||||
@ -2084,6 +2085,7 @@ class e_media
|
||||
$fileName = $fileName_a . '_' . $count . $fileName_b;
|
||||
}
|
||||
|
||||
|
||||
$filePath = $targetDir . $fileName;
|
||||
|
||||
// Create target dir
|
||||
@ -2139,7 +2141,7 @@ class e_media
|
||||
if($out)
|
||||
{
|
||||
// Read binary input stream and append it to temp file
|
||||
$tmpName = e107::getParser()->filter($_FILES['file']['tmp_name'],'str');
|
||||
$tmpName = e107::getParser()->filter($_FILES['file']['tmp_name']);
|
||||
$in = fopen($tmpName, "rb");
|
||||
|
||||
if($in)
|
||||
@ -2224,9 +2226,32 @@ class e_media
|
||||
rename("{$filePath}.part", $filePath);
|
||||
}
|
||||
|
||||
return $this->processAjaxImport($filePath, $_REQUEST);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* For Internal Use Only
|
||||
* Second half of processAjaxUpload()
|
||||
* Subject to change at any time. Use at own risk.
|
||||
*
|
||||
* @param string $filePath
|
||||
* @param array $request
|
||||
* @return false|string
|
||||
*/
|
||||
public function processAjaxImport($filePath, $request = array())
|
||||
{
|
||||
if(!file_exists($filePath))
|
||||
{
|
||||
return '{"jsonrpc" : "2.0", "error" : {"code": 110, "message": "File Not Found: '.$filePath.'"}, "id" : "id"}';
|
||||
}
|
||||
|
||||
$targetDir = e_IMPORT;
|
||||
$fileName = basename($filePath);
|
||||
|
||||
if(e107::getFile()->isClean($filePath) !== true)
|
||||
{
|
||||
$this->ajaxUploadLog($filePath,$fileName, filesize($filePath), false);
|
||||
$this->ajaxUploadLog($filePath, $fileName, filesize($filePath), false, "File detected as not clean. (".__METHOD__.")");
|
||||
@unlink($filePath);
|
||||
return '{"jsonrpc" : "2.0", "error" : {"code": 104, "message": "Bad File Detected. '.$filePath.'"}, "id" : "id"}';
|
||||
}
|
||||
@ -2234,14 +2259,14 @@ class e_media
|
||||
|
||||
$convertToJpeg = e107::getPref('convert_to_jpeg', 0);
|
||||
|
||||
if(!empty($_REQUEST['convert']) && $_REQUEST['convert'] === 'jpg')
|
||||
if(!empty($request['convert']) && $request['convert'] === 'jpg')
|
||||
{
|
||||
$convertToJpeg = true;
|
||||
}
|
||||
|
||||
$fileSize = filesize($filePath);
|
||||
|
||||
if(varset($_REQUEST['for']) !== '_icon' && !empty($convertToJpeg))
|
||||
if(varset($request['for']) !== '_icon' && !empty($convertToJpeg))
|
||||
{
|
||||
if($jpegFile = e107::getMedia()->convertImageToJpeg($filePath, true))
|
||||
{
|
||||
@ -2252,12 +2277,12 @@ class e_media
|
||||
|
||||
}
|
||||
|
||||
if(!empty($_REQUEST['resize']))
|
||||
if(!empty($request['resize']))
|
||||
{
|
||||
|
||||
$thumb = Intervension::make($filePath);
|
||||
$w = (int) $_REQUEST['resize']['w'];
|
||||
$h = (int) $_REQUEST['resize']['h'];
|
||||
$w = (int) $request['resize']['w'];
|
||||
$h = (int) $request['resize']['h'];
|
||||
|
||||
$thumb->resize(vartrue($w, null), vartrue($h, null), function ($constraint)
|
||||
{
|
||||
@ -2269,9 +2294,9 @@ class e_media
|
||||
|
||||
}
|
||||
|
||||
if(!empty($_REQUEST['rename']))
|
||||
if(!empty($request['rename']))
|
||||
{
|
||||
$newPath = $targetDir.basename($_REQUEST['rename']);
|
||||
$newPath = $targetDir.basename($request['rename']);
|
||||
if(!rename($filePath, $newPath))
|
||||
{
|
||||
return '{"jsonrpc" : "2.0", "error" : {"code": 105, "message": "Unable to rename '.$filePath.' to '.$newPath.'"}, "id" : "id"}';
|
||||
@ -2279,13 +2304,18 @@ class e_media
|
||||
$fileName = basename($newPath);
|
||||
}
|
||||
|
||||
if(!empty($_REQUEST['for'])) // leave in upload directory if no category given.
|
||||
$msg = '';
|
||||
|
||||
if(!empty($request['for'])) // leave in upload directory if no category given.
|
||||
{
|
||||
$uploadPath = varset($_REQUEST['path'],null);
|
||||
$for = e107::getParser()->filter($_REQUEST['for']);
|
||||
$uploadPath = varset($request['path'],null);
|
||||
$for = e107::getParser()->filter($request['for']);
|
||||
$for = str_replace(array('+','^'),'', $for);
|
||||
|
||||
$result = e107::getMedia()->importFile($fileName, $for, array('path'=>$uploadPath));
|
||||
if(!$result = e107::getMedia()->importFile($fileName, $for, array('path'=>$uploadPath)))
|
||||
{
|
||||
$msg = 'Unable to import ('.__METHOD__.' Line: '.__LINE__ .')';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -2293,43 +2323,45 @@ class e_media
|
||||
}
|
||||
|
||||
|
||||
$this->ajaxUploadLog($filePath,$fileName,$fileSize,$result);
|
||||
|
||||
|
||||
|
||||
// file_put_contents(e_LOG."mediatmp.log", print_r($previewArr,true));
|
||||
$this->ajaxUploadLog($filePath,$fileName,$fileSize,$result, $msg);
|
||||
|
||||
$opts = array();
|
||||
|
||||
// set correct size for preview image.
|
||||
if(isset($_REQUEST['w']))
|
||||
if(isset($request['w']))
|
||||
{
|
||||
$opts['w'] = (int) $_REQUEST['w'];
|
||||
$opts['w'] = (int) $request['w'];
|
||||
}
|
||||
|
||||
if(isset($_REQUEST['h']))
|
||||
if(isset($request['h']))
|
||||
{
|
||||
$opts['h'] = (int) $_REQUEST['h'];
|
||||
$opts['h'] = (int) $request['h'];
|
||||
}
|
||||
|
||||
$preview = $this->previewTag($result,$opts);
|
||||
$array = array("jsonrpc" => "2.0", "result" => $result, "id" => "id", 'preview' => $preview, 'data'=>$_FILES );
|
||||
|
||||
return json_encode($array);
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
private function ajaxUploadLog($filePath,$fileName,$fileSize,$result)
|
||||
private function ajaxUploadLog($filePath,$fileName,$fileSize,$result, $msg='')
|
||||
{
|
||||
$log = e107::getParser()->filter($_GET,'str');
|
||||
$log = e107::getParser()->filter($_GET);
|
||||
|
||||
$log['filepath'] = str_replace('../','',$filePath);
|
||||
$log['filename'] = $fileName;
|
||||
$log['filesize'] = $fileSize;
|
||||
$log['status'] = ($result) ? 'ok' : 'failed';
|
||||
$log['_files'] = $_FILES;
|
||||
$log['_request'] = $_REQUEST;
|
||||
|
||||
if(!empty($msg))
|
||||
{
|
||||
$log['_msg'] = $msg;
|
||||
}
|
||||
|
||||
// $log['_get'] = $_GET;
|
||||
// $log['_post'] = $_POST;
|
||||
$type = ($result) ? E_LOG_INFORMATIVE : E_LOG_WARNING;
|
||||
|
@ -237,12 +237,24 @@ class e_fileTest extends \Codeception\Test\Unit
|
||||
|
||||
public function testGet_file_info()
|
||||
{
|
||||
$path = APP_PATH."/e107_web/lib/font-awesome/4.7.0/fonts/fontawesome-webfont.svg";
|
||||
$tests = array(
|
||||
0 => array('input' => "e107_web/lib/font-awesome/4.7.0/fonts/fontawesome-webfont.svg", 'expected'=>'image/svg+xml'),
|
||||
1 => array('input' => "e107_plugins/gallery/images/beach.webp", 'expected'=>'image/webp'),
|
||||
2 => array('input' => "e107_tests/tests/_data/fileTest/corrupted_image.webp", 'expected'=>false),
|
||||
);
|
||||
|
||||
$ret = $this->fl->get_file_info($path);
|
||||
foreach($tests as $item)
|
||||
{
|
||||
$path = APP_PATH.'/'.$item['input'];
|
||||
$ret = $this->fl->get_file_info($path);
|
||||
|
||||
$this->assertEquals('image/svg+xml',$ret['mime']);
|
||||
if($ret === false)
|
||||
{
|
||||
$ret = array('mime'=>false);
|
||||
}
|
||||
|
||||
$this->assertEquals($item['expected'], $ret['mime']);
|
||||
}
|
||||
|
||||
}
|
||||
/*
|
||||
|
@ -23,7 +23,7 @@
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
$this->fail("Couldn't load e_media object");
|
||||
$this->fail($e->getMessage());
|
||||
}
|
||||
|
||||
}
|
||||
@ -37,25 +37,58 @@
|
||||
array('path'=>'path-to-file/audio' , 'mime' => 'audio/mpeg', 'expected'=>'path-to-file/audio.mp3'),
|
||||
array('path'=>'path-to-file/audio.mp3', 'mime' => 'audio/mpeg', 'expected'=>'path-to-file/audio.mp3'),
|
||||
array('path'=>'path-to-file/image.svg', 'mime' => 'svg+xml', 'expected'=>'path-to-file/image.svg'),
|
||||
array('path'=>'path-to-file/image.webp', 'mime' => 'svg+xml', 'expected'=>'path-to-file/image.webp'),
|
||||
);
|
||||
|
||||
|
||||
foreach($types as $val)
|
||||
{
|
||||
$actual = $this->md->checkFileExtension($val['path'],$val['mime']);
|
||||
|
||||
$this->assertEquals($val['expected'],$actual);
|
||||
//echo ($actual)."\n";
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
public function testProcessAjaxUpload()
|
||||
public function testProcessAjaxImport()
|
||||
{
|
||||
$tests = array(
|
||||
0 => array(
|
||||
'file' => e_PLUGIN."gallery/images/horse.jpg",
|
||||
'param' => array (
|
||||
'for' => 'news ',
|
||||
'w' => '206',
|
||||
'h' => '190',
|
||||
),
|
||||
),
|
||||
1 => array(
|
||||
'file' => e_PLUGIN."gallery/images/beach.webp",
|
||||
'param' => array (
|
||||
'for' => 'news ',
|
||||
'w' => '206',
|
||||
'h' => '190',
|
||||
),
|
||||
),
|
||||
|
||||
// @todo
|
||||
);
|
||||
|
||||
foreach($tests as $index => $var)
|
||||
{
|
||||
$source = $var['file'];
|
||||
$file = e_IMPORT.basename($var['file']);
|
||||
copy($source,$file);
|
||||
|
||||
$json = $this->md->processAjaxImport($file,$var['param']);
|
||||
|
||||
$result = json_decode($json, JSON_PRETTY_PRINT);
|
||||
// var_dump($result);
|
||||
$this->assertNotFalse($result);
|
||||
|
||||
// var_dump($result);
|
||||
|
||||
$this->assertStringEndsWith('/'.basename($var['file']), $result['result']);
|
||||
|
||||
$this->assertNotEmpty($result['preview']);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -99,26 +132,29 @@
|
||||
*/
|
||||
public function testImportFile()
|
||||
{
|
||||
/* FIXME: https://github.com/e107inc/e107/issues/4033
|
||||
$icon = codecept_data_dir()."icon_64.png";
|
||||
$dest = e_IMPORT."icon_64.png";
|
||||
copy($icon,$dest);
|
||||
/* FIXME: https://github.com/e107inc/e107/issues/4033 */
|
||||
|
||||
if(!file_exists($dest))
|
||||
{
|
||||
$this->fail("Couldn't copy icon to ".$dest);
|
||||
}
|
||||
|
||||
$tests = array(
|
||||
0 => array('file'=> 'icon_64.png', 'cat' => '_icon', 'expected'=>"{e_MEDIA_ICON}icon_64.png"),
|
||||
// 0 => array('file'=> codecept_data_dir().'icon_64.png', 'cat' => '_icon', 'expected'=>"{e_MEDIA_ICON}icon_64.png"),
|
||||
1 => array('file'=> e_PLUGIN.'gallery/images/horse.jpg', 'cat' => 'news', 'expected'=>"horse.jpg"),
|
||||
2 => array('file'=> e_PLUGIN.'gallery/images/beach.webp', 'cat' => 'news', 'expected'=>"beach.webp"),
|
||||
);
|
||||
|
||||
foreach($tests as $var)
|
||||
{
|
||||
$result = $this->md->importFile($var['file'], $var['cat']);
|
||||
$this->assertEquals($var['expected'],$result);
|
||||
$importPath = e_IMPORT.basename($var['file']);
|
||||
copy($var['file'], $importPath);
|
||||
|
||||
if(!file_exists($importPath))
|
||||
{
|
||||
$this->fail("Couldn't copy file to ".$importPath);
|
||||
}
|
||||
|
||||
$result = $this->md->importFile($importPath, $var['cat']);
|
||||
$this->assertStringEndsWith($var['expected'],$result);
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
/*
|
||||
public function testBrowserCarousel()
|
||||
|
@ -33,4 +33,3 @@
|
||||
exit;
|
||||
|
||||
|
||||
?>
|
Loading…
x
Reference in New Issue
Block a user