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