...
 
Commits (2)
......@@ -10,7 +10,7 @@ namespace Minds\Controllers\fs\v1;
use Minds\Core;
use Minds\Entities;
use Minds\Interfaces;
use Minds\Api\Factory;
use Minds\Helpers\File;
class avatars implements Interfaces\FS
{
......@@ -59,10 +59,8 @@ class avatars implements Interfaces\FS
$contents = file_get_contents($filepath);
}
if ($filepath) {
$finfo = finfo_open(FILEINFO_MIME);
$mimetype = finfo_file($finfo, $filepath);
finfo_close($finfo);
if (!empty($contents)) {
$mimetype = File::getMime($contents);
} else {
$mimetype = 'image/jpeg';
}
......
......@@ -10,7 +10,7 @@ namespace Minds\Controllers\fs\v1;
use Minds\Core;
use Minds\Entities;
use Minds\Interfaces;
use Minds\Api\Factory;
use Minds\Helpers\File;
class banners implements Interfaces\FS
{
......@@ -102,9 +102,7 @@ class banners implements Interfaces\FS
}
}
$finfo = finfo_open(FILEINFO_MIME);
$mimetype = finfo_buffer($finfo, $content);
finfo_close($finfo);
$mimetype = File::getMime($content);
header('Content-Type: '.$mimetype);
header('Expires: ' . date('r', time() + 864000));
......
......@@ -10,7 +10,7 @@ namespace Minds\Controllers\fs\v1;
use Minds\Core;
use Minds\Entities;
use Minds\Interfaces;
use Minds\Api\Factory;
use Minds\Helpers\File;
class paywall implements Interfaces\FS
{
......@@ -31,9 +31,7 @@ class paywall implements Interfaces\FS
$contents = file_get_contents(Core\Di\Di::_()->get('Config')->get('path') . 'engine/Assets/photos/andromeda-galaxy.jpg');
}
$finfo = finfo_open(FILEINFO_MIME);
$mimetype = finfo_file($finfo, $filepath);
finfo_close($finfo);
$mimetype = File::getMime($contents);
header('Content-Type: '.$mimetype);
header('Expires: ' . date('r', time() + 864000));
header("Pragma: public");
......
......@@ -6,9 +6,9 @@ namespace Minds\Controllers\fs\v1;
use Minds\Core;
use Minds\Core\Di\Di;
use Minds\Entities;
use Minds\Interfaces;
use Minds\Core\Features\Manager as FeaturesManager;
use Minds\Helpers\File;
class thumbnail extends Core\page implements Interfaces\page
{
......@@ -47,8 +47,7 @@ class thumbnail extends Core\page implements Interfaces\page
}
try {
$finfo = new \finfo(FILEINFO_MIME);
$contentType = $finfo->buffer($contents) ?: 'image/jpeg';
$contentType = File::getMime($contents);
} catch (\Exception $e) {
error_log($e);
$contentType = 'image/jpeg';
......
......@@ -20,7 +20,7 @@ class Image implements AssetsInterface
public function upload(array $media, array $data)
{
$filename = "/image/{$this->entity->batch_guid}/{$this->entity->guid}/master.jpg";
$filename = "image/{$this->entity->batch_guid}/{$this->entity->guid}/master.jpg";
// @note: legacy file handling
$file = new \ElggFile();
......
......@@ -9,6 +9,7 @@
namespace Minds\Core\Media\Proxy;
use Minds\Core\Di\Di;
use Minds\Helpers\File;
use Minds\Core\Http\Curl\Client;
use Minds\Traits\MagicAttributes;
......@@ -99,8 +100,7 @@ class Download
throw new \Exception('Invalid image');
}
$finfo = new \finfo(FILEINFO_MIME);
$mime = $finfo->buffer($content);
$mime = File::getMime($content);
if (!$mime) {
throw new \Exception('Cannot read image MIME');
......
......@@ -5,9 +5,11 @@ namespace Minds\Core\Storage\Services;
use Aws\S3\S3Client;
use Minds\Core\Config;
use Minds\Core\Di\Di;
use Minds\Helpers\File;
class S3 implements ServiceInterface
{
/** @var S3Client */
public $s3;
public $filepath;
public $mode;
......@@ -61,10 +63,7 @@ class S3 implements ServiceInterface
public function write($data)
{
//TODO: check mime performance here
$finfo = new \finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->buffer($data);
$mimeType = File::getMimeType($data);
$write = $this->s3->putObject([
// 'ACL' => 'public-read',
......@@ -72,16 +71,9 @@ class S3 implements ServiceInterface
'Key' => $this->filepath,
'ContentType' => $mimeType,
'ContentLength' => strlen($data),
//'ContentLength' => filesize($file),
'Body' => $data,
]);
//also write to disk until full migration
/*$disk = new Disk();
$disk->open($this->filepath, 'write');
$disk->write($data);
$disk->close();*/
return true;
}
......@@ -104,18 +96,7 @@ class S3 implements ServiceInterface
break;
case "redirect":
default:
//for now, check if the file exists, and fallback to disk if not!
/*if (!$this->s3->doesObjectExist(Config::_()->aws['bucket'], $this->filepath)) {
$disk = new Disk();
$disk->open($this->filepath, 'read');
$content = $disk->read();
$disk->close();
return $content;
}*/
$url = $this->s3->getObjectUrl(Config::_()->aws['bucket'], $this->filepath, "+15 minutes");
//$this->filepath = str_replace('//', '/', $this->filepath);
//$url = Config::_()->aws['cloudfront'] . $this->filepath;
header("Location: $url");
exit;
}
......
<?php
namespace Minds\Helpers;
class File
{
const HEADER_LENGTH = 16;
public static function getMimeType(&$data): string
{
return self::getType($data, FILEINFO_MIME_TYPE);
}
public static function getMime(&$data): string
{
return self::getType($data, FILEINFO_MIME);
}
protected static function getType(&$data, int $type): string
{
$header = substr($data, 0, self::HEADER_LENGTH);
$finfo = new \finfo($type);
$type = $finfo->buffer($header);
unset($finfo);
return $type;
}
}
......@@ -121,49 +121,6 @@ class ElggFile extends ElggObject {
return $this->mimetype = $mimetype;
}
/**
* Detects mime types based on filename or actual file.
*
* @param mixed $file The full path of the file to check. For uploaded files, use tmp_name.
* @param mixed $default A default. Useful to pass what the browser thinks it is.
* @since 1.7.12
*
* @note If $file is provided, this may be called statically
*
* @return mixed Detected type on success, false on failure.
*/
public function detectMimeType($file = null, $default = null) {
if (!$file) {
if (isset($this) && $this->filename) {
$file = $this->filename;
} else {
return false;
}
}
$mime = false;
// for PHP5 folks.
if (function_exists('finfo_file') && defined('FILEINFO_MIME_TYPE')) {
$resource = finfo_open(FILEINFO_MIME_TYPE);
if ($resource) {
$mime = finfo_file($resource, $file);
}
}
// for everyone else.
if (!$mime && function_exists('mime_content_type')) {
$mime = mime_content_type($file);
}
// default
if (!$mime) {
return $default;
}
return $mime;
}
/**
* Set the optional file description.
*
......@@ -363,4 +320,11 @@ class ElggFile extends ElggObject {
return $this->filestore;
}
/**
* Executed prior to object serialization
*/
public function __sleep()
{
unset($this->handle);
}
}