You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

156 lines
4.0 KiB

<?php
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
/**
*
*/
class MimeLib
{
/**
* @param $filename
* @param $path
* @return string
*/
public static function from_path($filename, $path)
{
if ($type = self::physical_check_from_path($path)) {
return self::handle_physical_exceptions($type, $filename);
}
return self::from_file_extension($filename);
}
/**
* @param $filename
* @param $content
* @return string
*/
public static function from_content($filename, $content)
{
if ($type = self::physical_check_from_content($content)) {
return self::handle_physical_exceptions($type, $filename, $content);
}
return self::from_file_extension($filename);
}
/**
* @param $filename
* @return string
*/
public static function from_filename($filename)
{
return self::from_file_extension($filename);
}
/**
* @param $type
* @param $filename
* @param $content
* @return string
*/
private static function handle_physical_exceptions($type, $filename, $content = '')
{
global $prefs;
if ($type === 'application/zip' || $type === 'application/octet-stream' || $type === 'application/vnd.ms-office') {
return self::from_file_extension($filename);
} elseif ($type === 'text/html' && self::get_extension($filename) == 'svg') {
$type = 'image/svg+xml';
} elseif ($type === 'text/html' && $prefs['vimeo_upload'] === 'y' && is_numeric($filename)) {
if (strpos($content, 'vimeo.com') !== false) {
$type = 'video/vimeo';
}
} else {
$extension = self::get_extension($filename);
if (in_array($extension, ["xlsx", "xltx", "potx", "ppsx", "pptx", "sldx", "docx", "dotx", "xlam", "xlsb"])) {
return self::from_file_extension($filename);
}
}
return $type;
}
/**
* @param $filename
* @return string
*/
private static function get_extension($filename)
{
$ext = pathinfo($filename);
return isset($ext['extension']) ? $ext['extension'] : '';
}
/**
* @param $filename
* @return string
*/
private static function from_file_extension($filename)
{
global $mimetypes;
include_once(__DIR__ . '/../mime/mimetypes.php');
if (isset($mimetypes)) {
$ext = self::get_extension($filename);
$mimetype = isset($mimetypes[$ext]) ? $mimetypes[$ext] : '';
if (! empty($mimetype)) {
return $mimetype;
}
}
return "application/octet-stream";
}
/**
* @param $path
* @return string
*/
private static function physical_check_from_path($path)
{
if ($finfo = self::get_finfo()) {
if (file_exists($path)) {
$type = $finfo->file($path); // Heuristically determine most likely MIME type based on the contents of the file at $path
return $type;
}
}
}
/**
* @param $content
* @return string
*/
private static function physical_check_from_content($content)
{
if ($finfo = self::get_finfo()) {
$type = $finfo->buffer($content);
return $type;
}
}
/**
* @return finfo
*/
private static function get_finfo()
{
static $finfo = false;
global $prefs;
if ($finfo) {
return $finfo;
}
if ($prefs['tiki_check_file_content'] == 'y' && class_exists('finfo')) {
$finfo = new finfo(FILEINFO_MIME_TYPE);
if ($finfo) {
return $finfo;
}
}
}
}