diff --git a/src/get-mime-type.php b/src/get-mime-type.php index 380cb73..635b748 100644 --- a/src/get-mime-type.php +++ b/src/get-mime-type.php @@ -1,12 +1,32 @@ /** - * Get the mime type based on file extension + * Get the file extension from a full path OR file name. * - * @param string $file The file name or path + * @param string $file The full file path or file name. * - * @return string the mime type on success - * + * @return string The file extension in lowercase or an empty string if none found. + * @since 5.0.3 */ - public static function mimeType($file) + public static function extension(string $file): string + { + // Ensure the input is a valid string and contains a file extension + if (strpos($file, '.') === false) + { + return ''; + } + + // Extract and return the extension from the path + return strtolower(pathinfo($file, PATHINFO_EXTENSION)); + } + + /** + * Get the mime type based on the full file path. + * + * @param string $file The full file path. + * + * @return string The mime type or 'application/octet-stream' if none found. + * @since 5.0.3 + */ + public static function mimeType(string $file): string { /** * **DISCLAIMER** @@ -14,25 +34,60 @@ * array. It does not guarantee that the file is TRULY that * of the extension that this function returns. * https://gist.github.com/Llewellynvdm/74be373357e131b8775a7582c3de508b - */ + */ - // get the extension form file - $extension = strtolower(pathinfo($file, PATHINFO_EXTENSION)); - // check if we have the extension listed - if (isset(self::$fileExtensionToMimeType[$extension])) + // Ensure the file exists to avoid unnecessary processing + if (!is_file($file) || !is_readable($file)) + { + return self::mimeTypeFilename($file); + } + + // Use finfo to get MIME type based on file content if available + if (function_exists('finfo_open')) + { + $finfo = finfo_open(FILEINFO_MIME_TYPE); + $mimetype = finfo_file($finfo, $file); + finfo_close($finfo); + + if ($mimetype) + { + return $mimetype; + } + } + + // Fallback to mime_content_type() if available + if (function_exists('mime_content_type')) + { + $mimetype = mime_content_type($file); + if ($mimetype) + { + return $mimetype; + } + } + + // Fallback to application/octet-stream as a generic binary stream type + return 'application/octet-stream'; + } + + /** + * Get the mime type based on the file extension from a file name. + * + * @param string $file The file name (without path). + * + * @return string The mime type or 'application/octet-stream' if none found. + * @since 5.0.3 + */ + protected static function mimeTypeFilename(string $file): string + { + // Get the extension + $extension = self::extension($file); + + // Predefined MIME types by extension for quick lookup + if (!empty($extension) && isset(self::$fileExtensionToMimeType[$extension])) { return self::$fileExtensionToMimeType[$extension]; } - elseif (function_exists('mime_content_type')) - { - return mime_content_type($file); - } - elseif (function_exists('finfo_open')) - { - $finfo = finfo_open(FILEINFO_MIME); - $mimetype = finfo_file($finfo, $file); - finfo_close($finfo); - return $mimetype; - } + + // Fallback to application/octet-stream if extension is unknown return 'application/octet-stream'; }