Improved Mime Type detection
parent
248a7fa48a
commit
d3722c945b
|
@ -4734,13 +4734,8 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($filetype == "") {
|
$filetype = Images::getMimeTypeBySource($src, $filename, $filetype);
|
||||||
$filetype = Images::guessType($filename);
|
|
||||||
}
|
|
||||||
$imagedata = @getimagesize($src);
|
|
||||||
if ($imagedata) {
|
|
||||||
$filetype = $imagedata['mime'];
|
|
||||||
}
|
|
||||||
Logger::log(
|
Logger::log(
|
||||||
"File upload src: " . $src . " - filename: " . $filename .
|
"File upload src: " . $src . " - filename: " . $filename .
|
||||||
" - size: " . $filesize . " - type: " . $filetype,
|
" - size: " . $filesize . " - type: " . $filetype,
|
||||||
|
|
|
@ -706,9 +706,7 @@ function photos_post(App $a)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($type == "") {
|
$type = Images::getMimeTypeBySource($src, $filename, $type);
|
||||||
$type = Images::guessType($filename);
|
|
||||||
}
|
|
||||||
|
|
||||||
Logger::log('photos: upload: received file: ' . $filename . ' as ' . $src . ' ('. $type . ') ' . $filesize . ' bytes', Logger::DEBUG);
|
Logger::log('photos: upload: received file: ' . $filename . ' as ' . $src . ' ('. $type . ') ' . $filesize . ' bytes', Logger::DEBUG);
|
||||||
|
|
||||||
|
|
|
@ -174,23 +174,7 @@ function wall_upload_post(App $a, $desktopmode = true)
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is a special treatment for picture upload from Twidere
|
$filetype = Images::getMimeTypeBySource($src, $filename, $filetype);
|
||||||
if (($filename == "octet-stream") && ($filetype != "")) {
|
|
||||||
$filename = $filetype;
|
|
||||||
$filetype = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($filetype == "") {
|
|
||||||
$filetype = Images::guessType($filename);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If there is a temp name, then do a manual check
|
|
||||||
// This is more reliable than the provided value
|
|
||||||
|
|
||||||
$imagedata = getimagesize($src);
|
|
||||||
if ($imagedata) {
|
|
||||||
$filetype = $imagedata['mime'];
|
|
||||||
}
|
|
||||||
|
|
||||||
Logger::log("File upload src: " . $src . " - filename: " . $filename .
|
Logger::log("File upload src: " . $src . " - filename: " . $filename .
|
||||||
" - size: " . $filesize . " - type: " . $filetype, Logger::DEBUG);
|
" - size: " . $filesize . " - type: " . $filetype, Logger::DEBUG);
|
||||||
|
|
|
@ -453,6 +453,10 @@ class BBCode
|
||||||
{
|
{
|
||||||
$s = $srctext;
|
$s = $srctext;
|
||||||
|
|
||||||
|
// Simplify image links
|
||||||
|
$s = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '[img]$3[/img]', $s);
|
||||||
|
$s = preg_replace("/\[img\=(.*?)\](.*?)\[\/img\]/ism", '[img]$1[/img]', $s);
|
||||||
|
|
||||||
$matches = null;
|
$matches = null;
|
||||||
$c = preg_match_all('/\[img.*?\](.*?)\[\/img\]/ism', $s, $matches, PREG_SET_ORDER);
|
$c = preg_match_all('/\[img.*?\](.*?)\[\/img\]/ism', $s, $matches, PREG_SET_ORDER);
|
||||||
if ($c) {
|
if ($c) {
|
||||||
|
@ -464,13 +468,14 @@ class BBCode
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$i = Network::fetchUrl($mtch[1]);
|
$curlResult = Network::curl($mtch[1], true);
|
||||||
if (!$i) {
|
if (!$curlResult->isSuccess()) {
|
||||||
return $srctext;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// guess mimetype from headers or filename
|
$i = $curlResult->getBody();
|
||||||
$type = Images::guessType($mtch[1], true);
|
$type = $curlResult->getContentType();
|
||||||
|
$type = Images::getMimeTypeByData($i, $mtch[1], $type);
|
||||||
|
|
||||||
if ($i) {
|
if ($i) {
|
||||||
$Image = new Image($i, $type);
|
$Image = new Image($i, $type);
|
||||||
|
|
|
@ -432,9 +432,7 @@ class Photo
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($type)) {
|
$type = Images::getMimeTypeByData($img_str, $image_url, $type);
|
||||||
$type = Images::guessType($image_url, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
$Image = new Image($img_str, $type);
|
$Image = new Image($img_str, $type);
|
||||||
if ($Image->isValid()) {
|
if ($Image->isValid()) {
|
||||||
|
|
|
@ -839,9 +839,16 @@ class User
|
||||||
$photo_failure = false;
|
$photo_failure = false;
|
||||||
|
|
||||||
$filename = basename($photo);
|
$filename = basename($photo);
|
||||||
$img_str = Network::fetchUrl($photo, true);
|
$curlResult = Network::curl($photo, true);
|
||||||
// guess mimetype from headers or filename
|
if ($curlResult->isSuccess()) {
|
||||||
$type = Images::guessType($photo, true);
|
$img_str = $curlResult->getBody();
|
||||||
|
$type = $curlResult->getContentType();
|
||||||
|
} else {
|
||||||
|
$img_str = '';
|
||||||
|
$type = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$type = Images::getMimeTypeByData($img_str, $photo, $type);
|
||||||
|
|
||||||
$Image = new Image($img_str, $type);
|
$Image = new Image($img_str, $type);
|
||||||
if ($Image->isValid()) {
|
if ($Image->isValid()) {
|
||||||
|
|
|
@ -52,9 +52,8 @@ class Index extends BaseSettings
|
||||||
$filename = basename($_FILES['userfile']['name']);
|
$filename = basename($_FILES['userfile']['name']);
|
||||||
$filesize = intval($_FILES['userfile']['size']);
|
$filesize = intval($_FILES['userfile']['size']);
|
||||||
$filetype = $_FILES['userfile']['type'];
|
$filetype = $_FILES['userfile']['type'];
|
||||||
if ($filetype == '') {
|
|
||||||
$filetype = Images::guessType($filename);
|
$filetype = Images::getMimeTypeBySource($src, $filename, $filetype);
|
||||||
}
|
|
||||||
|
|
||||||
$maximagesize = DI::config()->get('system', 'maximagesize', 0);
|
$maximagesize = DI::config()->get('system', 'maximagesize', 0);
|
||||||
|
|
||||||
|
|
|
@ -708,22 +708,6 @@ class Image
|
||||||
return Images::getFormatsMap();
|
return Images::getFormatsMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Guess image mimetype from filename or from Content-Type header
|
|
||||||
*
|
|
||||||
* @param string $filename Image filename
|
|
||||||
* @param boolean $fromcurl Check Content-Type header from curl request
|
|
||||||
* @param string $header passed headers to take into account
|
|
||||||
*
|
|
||||||
* @return string|null
|
|
||||||
* @throws Exception
|
|
||||||
* @deprecated in version 2019.12 please use Util\Images::guessType() instead.
|
|
||||||
*/
|
|
||||||
public static function guessType($filename, $fromcurl = false, $header = '')
|
|
||||||
{
|
|
||||||
return Images::guessType($filename, $fromcurl, $header);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $url url
|
* @param string $url url
|
||||||
* @return array
|
* @return array
|
||||||
|
|
|
@ -24,7 +24,6 @@ namespace Friendica\Util;
|
||||||
use Friendica\Core\Logger;
|
use Friendica\Core\Logger;
|
||||||
use Friendica\Core\System;
|
use Friendica\Core\System;
|
||||||
use Friendica\DI;
|
use Friendica\DI;
|
||||||
use Imagick;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Image utilities
|
* Image utilities
|
||||||
|
@ -74,47 +73,68 @@ class Images
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Guess image mimetype from filename or from Content-Type header
|
* Fetch image mimetype from the image data or guessing from the file name
|
||||||
*
|
*
|
||||||
* @param string $filename Image filename
|
* @param string $image_data Image data
|
||||||
* @param boolean $fromcurl Check Content-Type header from curl request
|
* @param string $filename File name (for guessing the type via the extension)
|
||||||
* @param string $header passed headers to take into account
|
* @param string $mime default mime type
|
||||||
*
|
*
|
||||||
* @return string|null
|
* @return string
|
||||||
* @throws \Exception
|
* @throws \Exception
|
||||||
*/
|
*/
|
||||||
public static function guessType($filename, $fromcurl = false, $header = '')
|
public static function getMimeTypeByData(string $image_data, string $filename = '', string $mime = '')
|
||||||
{
|
{
|
||||||
Logger::info('Image: guessType: ' . $filename . ($fromcurl ? ' from curl headers' : ''));
|
if (substr($mime, 0, 6) == 'image/') {
|
||||||
$type = null;
|
Logger::info('Using default mime type', ['filename' => $filename, 'mime' => $mime]);
|
||||||
if ($fromcurl) {
|
return $mime;
|
||||||
$headers = [];
|
|
||||||
$h = explode("\n", $header);
|
|
||||||
foreach ($h as $l) {
|
|
||||||
$data = array_map("trim", explode(":", trim($l), 2));
|
|
||||||
if (count($data) > 1) {
|
|
||||||
list($k, $v) = $data;
|
|
||||||
$headers[$k] = $v;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (array_key_exists('Content-Type', $headers)) {
|
$image = @getimagesizefromstring($image_data);
|
||||||
$type = $headers['Content-Type'];
|
if (!empty($image['mime'])) {
|
||||||
}
|
Logger::info('Mime type detected via data', ['filename' => $filename, 'default' => $mime, 'mime' => $image['mime']]);
|
||||||
|
return $image['mime'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::guessTypeByExtension($filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_null($type)) {
|
|
||||||
// Guessing from extension? Isn't that... dangerous?
|
|
||||||
if (class_exists('Imagick') && file_exists($filename) && is_readable($filename)) {
|
|
||||||
/**
|
/**
|
||||||
* Well, this not much better,
|
* Fetch image mimetype from the image data or guessing from the file name
|
||||||
* but at least it comes from the data inside the image,
|
*
|
||||||
* we won't be tricked by a manipulated extension
|
* @param string $sourcefile Source file of the image
|
||||||
|
* @param string $filename File name (for guessing the type via the extension)
|
||||||
|
* @param string $mime default mime type
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @throws \Exception
|
||||||
*/
|
*/
|
||||||
$image = new Imagick($filename);
|
public static function getMimeTypeBySource(string $sourcefile, string $filename = '', string $mime = '')
|
||||||
$type = $image->getImageMimeType();
|
{
|
||||||
} else {
|
if (substr($mime, 0, 6) == 'image/') {
|
||||||
$ext = pathinfo($filename, PATHINFO_EXTENSION);
|
Logger::info('Using default mime type', ['filename' => $filename, 'mime' => $mime]);
|
||||||
|
return $mime;
|
||||||
|
}
|
||||||
|
|
||||||
|
$image = @getimagesize($sourcefile);
|
||||||
|
if (!empty($image['mime'])) {
|
||||||
|
Logger::info('Mime type detected via file', ['filename' => $filename, 'default' => $mime, 'image' => $image]);
|
||||||
|
return $image['mime'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::guessTypeByExtension($filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Guess image mimetype from the filename
|
||||||
|
*
|
||||||
|
* @param string $filename Image filename
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @throws \Exception
|
||||||
|
*/
|
||||||
|
public static function guessTypeByExtension(string $filename)
|
||||||
|
{
|
||||||
|
$ext = pathinfo(parse_url($filename, PHP_URL_PATH), PATHINFO_EXTENSION);
|
||||||
$types = self::supportedTypes();
|
$types = self::supportedTypes();
|
||||||
$type = 'image/jpeg';
|
$type = 'image/jpeg';
|
||||||
foreach ($types as $m => $e) {
|
foreach ($types as $m => $e) {
|
||||||
|
@ -122,14 +142,11 @@ class Images
|
||||||
$type = $m;
|
$type = $m;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Logger::info('Image: guessType: type=' . $type);
|
Logger::info('Mime type guessed via extension', ['filename' => $filename, 'type' => $type]);
|
||||||
return $type;
|
return $type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $url
|
* @param string $url
|
||||||
* @return array
|
* @return array
|
||||||
|
|
Loading…
Reference in New Issue