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; } } }