Added option to detect file type based on header bytes
This commit is contained in:
parent
8f73b35fbb
commit
97abeb5254
@ -53,21 +53,34 @@ function add_image(string $tmpname, string $filename, string $tags): void
|
|||||||
assert(file_exists($tmpname));
|
assert(file_exists($tmpname));
|
||||||
|
|
||||||
$pathinfo = pathinfo($filename);
|
$pathinfo = pathinfo($filename);
|
||||||
if (!array_key_exists('extension', $pathinfo)) {
|
|
||||||
throw new UploadException("File has no extension");
|
|
||||||
}
|
|
||||||
$metadata = [];
|
$metadata = [];
|
||||||
$metadata['filename'] = $pathinfo['basename'];
|
$metadata['filename'] = $pathinfo['basename'];
|
||||||
$metadata['extension'] = $pathinfo['extension'];
|
if (array_key_exists('extension', $pathinfo)) {
|
||||||
|
$metadata['extension'] = $pathinfo['extension'];
|
||||||
|
}
|
||||||
|
|
||||||
$metadata['tags'] = Tag::explode($tags);
|
$metadata['tags'] = Tag::explode($tags);
|
||||||
$metadata['source'] = null;
|
$metadata['source'] = null;
|
||||||
$event = new DataUploadEvent($tmpname, $metadata);
|
$event = new DataUploadEvent($tmpname, $metadata);
|
||||||
send_event($event);
|
send_event($event);
|
||||||
if ($event->image_id == -1) {
|
|
||||||
throw new UploadException("File type not recognised");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function get_extension_from_mime(String $file_path): ?String
|
||||||
|
{
|
||||||
|
global $config;
|
||||||
|
$mime = mime_content_type($file_path);
|
||||||
|
if(!empty($mime)) {
|
||||||
|
$ext = get_extension($mime);
|
||||||
|
if(!empty($ext)) {
|
||||||
|
return $ext;
|
||||||
|
}
|
||||||
|
throw new UploadException("Could not determine extension for mimetype ".$mime);
|
||||||
|
}
|
||||||
|
throw new UploadException("Could not determine file mime type: ".$file_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Given a full size pair of dimensions, return a pair scaled down to fit
|
* Given a full size pair of dimensions, return a pair scaled down to fit
|
||||||
* into the configured thumbnail square, with ratio intact
|
* into the configured thumbnail square, with ratio intact
|
||||||
@ -410,4 +423,4 @@ function image_resize_gd(String $image_filename, array $info, int $new_width, in
|
|||||||
throw new ImageResizeException("Failed to save the new image, function returned false when saving type: $output_type");
|
throw new ImageResizeException("Failed to save the new image, function returned false when saving type: $output_type");
|
||||||
}
|
}
|
||||||
imagedestroy($image_resized);
|
imagedestroy($image_resized);
|
||||||
}
|
}
|
||||||
|
@ -310,7 +310,7 @@ function getMimeType(string $file, string $ext=""): string
|
|||||||
return 'application/octet-stream';
|
return 'application/octet-stream';
|
||||||
}
|
}
|
||||||
|
|
||||||
function getExtension(?string $mime_type): ?string
|
function get_extension(?string $mime_type): ?string
|
||||||
{
|
{
|
||||||
if (empty($mime_type)) {
|
if (empty($mime_type)) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -69,7 +69,9 @@ class BulkAddCSV extends Extension
|
|||||||
}
|
}
|
||||||
$metadata = [];
|
$metadata = [];
|
||||||
$metadata['filename'] = $pathinfo['basename'];
|
$metadata['filename'] = $pathinfo['basename'];
|
||||||
$metadata['extension'] = $pathinfo['extension'];
|
if (array_key_exists('extension', $pathinfo)) {
|
||||||
|
$metadata['extension'] = $pathinfo['extension'];
|
||||||
|
}
|
||||||
$metadata['tags'] = Tag::explode($tags);
|
$metadata['tags'] = Tag::explode($tags);
|
||||||
$metadata['source'] = $source;
|
$metadata['source'] = $source;
|
||||||
$event = new DataUploadEvent($tmpname, $metadata);
|
$event = new DataUploadEvent($tmpname, $metadata);
|
||||||
|
@ -325,9 +325,6 @@ class CronUploader extends Extension
|
|||||||
assert(file_exists($tmpname));
|
assert(file_exists($tmpname));
|
||||||
|
|
||||||
$pathinfo = pathinfo($filename);
|
$pathinfo = pathinfo($filename);
|
||||||
if (! array_key_exists('extension', $pathinfo)) {
|
|
||||||
throw new UploadException("File has no extension");
|
|
||||||
}
|
|
||||||
$metadata = [];
|
$metadata = [];
|
||||||
$metadata ['filename'] = $pathinfo ['basename'];
|
$metadata ['filename'] = $pathinfo ['basename'];
|
||||||
$metadata ['extension'] = $pathinfo ['extension'];
|
$metadata ['extension'] = $pathinfo ['extension'];
|
||||||
|
@ -366,7 +366,9 @@ class DanbooruApi extends Extension
|
|||||||
$fileinfo = pathinfo($filename);
|
$fileinfo = pathinfo($filename);
|
||||||
$metadata = [];
|
$metadata = [];
|
||||||
$metadata['filename'] = $fileinfo['basename'];
|
$metadata['filename'] = $fileinfo['basename'];
|
||||||
$metadata['extension'] = $fileinfo['extension'];
|
if (array_key_exists('extension', $fileinfo)) {
|
||||||
|
$metadata['extension'] = $fileinfo['extension'];
|
||||||
|
}
|
||||||
$metadata['tags'] = $posttags;
|
$metadata['tags'] = $posttags;
|
||||||
$metadata['source'] = $source;
|
$metadata['source'] = $source;
|
||||||
//log_debug("danbooru_api","========== NEW($filename) =========");
|
//log_debug("danbooru_api","========== NEW($filename) =========");
|
||||||
|
@ -18,9 +18,15 @@ class DataUploadEvent extends Event
|
|||||||
/** @var string */
|
/** @var string */
|
||||||
public $hash;
|
public $hash;
|
||||||
/** @var string */
|
/** @var string */
|
||||||
public $type;
|
public $type = "";
|
||||||
/** @var int */
|
/** @var int */
|
||||||
public $image_id = -1;
|
public $image_id = -1;
|
||||||
|
/** @var bool */
|
||||||
|
public $handled = false;
|
||||||
|
/** @var bool */
|
||||||
|
public $merged = false;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Some data is being uploaded.
|
* Some data is being uploaded.
|
||||||
@ -29,9 +35,10 @@ class DataUploadEvent extends Event
|
|||||||
*/
|
*/
|
||||||
public function __construct(string $tmpname, array $metadata)
|
public function __construct(string $tmpname, array $metadata)
|
||||||
{
|
{
|
||||||
|
global $config;
|
||||||
|
|
||||||
assert(file_exists($tmpname));
|
assert(file_exists($tmpname));
|
||||||
assert(is_string($metadata["filename"]));
|
assert(is_string($metadata["filename"]));
|
||||||
assert(is_string($metadata["extension"]));
|
|
||||||
assert(is_array($metadata["tags"]));
|
assert(is_array($metadata["tags"]));
|
||||||
assert(is_string($metadata["source"]) || is_null($metadata["source"]));
|
assert(is_string($metadata["source"]) || is_null($metadata["source"]));
|
||||||
|
|
||||||
@ -43,7 +50,17 @@ class DataUploadEvent extends Event
|
|||||||
|
|
||||||
// useful for most file handlers, so pull directly into fields
|
// useful for most file handlers, so pull directly into fields
|
||||||
$this->hash = $this->metadata['hash'];
|
$this->hash = $this->metadata['hash'];
|
||||||
$this->type = strtolower($metadata['extension']);
|
|
||||||
|
if($config->get_bool("upload_use_mime")) {
|
||||||
|
$this->type = strtolower(get_extension_from_mime($tmpname));
|
||||||
|
$this->metadata["extension"] = $this->type;
|
||||||
|
} else {
|
||||||
|
if(array_key_exists('extension',$metadata)&&!empty($metadata['extension'])) {
|
||||||
|
$this->type = strtolower($metadata['extension']);
|
||||||
|
} else {
|
||||||
|
throw new UploadException("Could not determine extension for file ".$metadata["filename"]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,6 +93,7 @@ class Upload extends Extension
|
|||||||
$config->set_default_int('upload_size', parse_shorthand_int('1MB'));
|
$config->set_default_int('upload_size', parse_shorthand_int('1MB'));
|
||||||
$config->set_default_int('upload_min_free_space', parse_shorthand_int('100MB'));
|
$config->set_default_int('upload_min_free_space', parse_shorthand_int('100MB'));
|
||||||
$config->set_default_bool('upload_tlsource', true);
|
$config->set_default_bool('upload_tlsource', true);
|
||||||
|
$config->set_default_bool('upload_use_mime', false);
|
||||||
|
|
||||||
$this->is_full = false;
|
$this->is_full = false;
|
||||||
|
|
||||||
@ -108,6 +126,7 @@ class Upload extends Extension
|
|||||||
$sb->add_label("<i>PHP Limit = ".ini_get('upload_max_filesize')."</i>");
|
$sb->add_label("<i>PHP Limit = ".ini_get('upload_max_filesize')."</i>");
|
||||||
$sb->add_choice_option("transload_engine", $tes, "<br/>Transload: ");
|
$sb->add_choice_option("transload_engine", $tes, "<br/>Transload: ");
|
||||||
$sb->add_bool_option("upload_tlsource", "<br/>Use transloaded URL as source if none is provided: ");
|
$sb->add_bool_option("upload_tlsource", "<br/>Use transloaded URL as source if none is provided: ");
|
||||||
|
$sb->add_bool_option("upload_use_mime", "<br/>Use mime type to determine file types: ");
|
||||||
$event->panel->add_block($sb);
|
$event->panel->add_block($sb);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -307,7 +326,9 @@ class Upload extends Extension
|
|||||||
$pathinfo = pathinfo($file['name']);
|
$pathinfo = pathinfo($file['name']);
|
||||||
$metadata = [];
|
$metadata = [];
|
||||||
$metadata['filename'] = $pathinfo['basename'];
|
$metadata['filename'] = $pathinfo['basename'];
|
||||||
$metadata['extension'] = $pathinfo['extension'];
|
if (array_key_exists('extension', $pathinfo)) {
|
||||||
|
$metadata['extension'] = $pathinfo['extension'];
|
||||||
|
}
|
||||||
$metadata['tags'] = $tags;
|
$metadata['tags'] = $tags;
|
||||||
$metadata['source'] = $source;
|
$metadata['source'] = $source;
|
||||||
|
|
||||||
@ -318,9 +339,6 @@ class Upload extends Extension
|
|||||||
|
|
||||||
$event = new DataUploadEvent($file['tmp_name'], $metadata);
|
$event = new DataUploadEvent($file['tmp_name'], $metadata);
|
||||||
send_event($event);
|
send_event($event);
|
||||||
if ($event->image_id == -1) {
|
|
||||||
throw new UploadException("File type not recognised");
|
|
||||||
}
|
|
||||||
$page->add_http_header("X-Shimmie-Image-ID: ".int_escape($event->image_id));
|
$page->add_http_header("X-Shimmie-Image-ID: ".int_escape($event->image_id));
|
||||||
} catch (UploadException $ex) {
|
} catch (UploadException $ex) {
|
||||||
$this->theme->display_upload_error(
|
$this->theme->display_upload_error(
|
||||||
@ -389,7 +407,7 @@ class Upload extends Extension
|
|||||||
|
|
||||||
$ext = false;
|
$ext = false;
|
||||||
if (is_array($headers)) {
|
if (is_array($headers)) {
|
||||||
$ext = getExtension(findHeader($headers, 'Content-Type'));
|
$ext = get_extension(findHeader($headers, 'Content-Type'));
|
||||||
}
|
}
|
||||||
if ($ext === false) {
|
if ($ext === false) {
|
||||||
$ext = $pathinfo['extension'];
|
$ext = $pathinfo['extension'];
|
||||||
@ -411,8 +429,8 @@ class Upload extends Extension
|
|||||||
$metadata['replace'] = $replace;
|
$metadata['replace'] = $replace;
|
||||||
}
|
}
|
||||||
|
|
||||||
$event = new DataUploadEvent($tmp_filename, $metadata);
|
|
||||||
try {
|
try {
|
||||||
|
$event = new DataUploadEvent($tmp_filename, $metadata);
|
||||||
send_event($event);
|
send_event($event);
|
||||||
} catch (UploadException $ex) {
|
} catch (UploadException $ex) {
|
||||||
$this->theme->display_upload_error(
|
$this->theme->display_upload_error(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user