using System.Collections.Generic;
using System.Linq;
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类型的默认字典(Content types)
///
public static Dictionary MimeTypes { get; }
static MimeMapper()
{
MimeTypes = DefaultMimeItems.Items.ToDictionary(item => "." + item.Extension, item => item.MimeType);
}
///
///
///
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)
{
if (MimeTypes.ContainsKey(mapping.Extension))
{
MimeTypes[mapping.Extension] = mapping.MimeType;
}
else
{
MimeTypes.Add(mapping.Extension, mapping.MimeType);
}
}
}
return this;
}
///
/// 返回特定文件扩展名的Content-Type,如果未找到任何对应关系,则返回默认值
///
///
///
public string GetMimeFromExtension(string fileExtension)
{
fileExtension = (fileExtension ?? string.Empty).ToLower();
fileExtension = fileExtension.Trim().StartsWith(".") ? fileExtension.Replace(".", "") : fileExtension;
return MimeTypes.ContainsKey(fileExtension) ? MimeTypes[fileExtension] : DefaultMime;
}
///
/// 根据路径获取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;
}
}
}