using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace Masuit.Tools.AspNetCore.Mime
{
///
/// 默认MIME映射器,可以根据文件扩展名获取标准内容类型。
///
public class MimeMapper : IMimeMapper
{
///
/// 默认Mime - 如果没有找到任何其他映射则作为默认的Mime-Type
///
public const string DefaultMime = "application/octet-stream";
///
/// 在文件路径中搜索文件扩展名的默认正则表达式
///
private readonly Regex _pathExtensionPattern = new Regex("\\.(\\w*)$");
///
/// Mime类型与扩展名的映射字典(扩展名:mimetype)
///
public static Dictionary MimeTypes { get; } = new Dictionary();
///
/// mime类型与扩展名的映射关系(mimetype:扩展名)
///
public static Dictionary ExtTypes { get; } = new Dictionary();
static MimeMapper()
{
foreach (var item in DefaultMimeItems.Items)
{
MimeTypes["." + item.Extension] = item.MimeType;
ExtTypes[item.MimeType] = "." + item.Extension;
}
}
///
///
///
public MimeMapper() : this(null)
{
}
///
///
///
///
public MimeMapper(params MimeMappingItem[] extensions)
{
Extend(extensions);
}
///
/// 扩展mime映射规则的标准列表。扩展的具有更高的优先级 - 如果扩展具有与标准项相同的扩展名,则会覆盖默认的mime
///
///
///
public IMimeMapper Extend(params MimeMappingItem[] extensions)
{
if (extensions != null)
{
foreach (var mapping in extensions)
{
MimeTypes[mapping.Extension] = mapping.MimeType;
ExtTypes[mapping.MimeType] = mapping.Extension;
}
}
return this;
}
///
/// 返回特定文件扩展名的Content-Type,如果未找到任何对应关系,则返回默认值
///
///
///
public string GetMimeFromExtension(string fileExtension)
{
fileExtension = (fileExtension ?? string.Empty).ToLower();
return MimeTypes.ContainsKey(fileExtension) ? MimeTypes[fileExtension] : DefaultMime;
}
///
/// 返回特定Content-Type的文件扩展名,如果未找到任何对应关系,则返回空值
///
///
///
public string GetExtensionFromMime(string mime)
{
mime = (mime ?? string.Empty).ToLower();
return ExtTypes.ContainsKey(mime) ? ExtTypes[mime] : "";
}
///
/// 根据路径获取MimeType
///
///
///
public string GetMimeFromPath(string path)
{
var extension = GetExtension(path);
return GetMimeFromExtension(extension);
}
///
/// 获取扩展名
///
///
///
protected string GetExtension(string path)
{
var match = _pathExtensionPattern.Match(path ?? string.Empty);
if (match.Groups.Count > 1)
{
return match.Groups[1].Value;
}
return null;
}
}
}