MimeMapper.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. using System.Collections.Generic;
  2. using System.Text.RegularExpressions;
  3. namespace Masuit.Tools.AspNetCore.Mime
  4. {
  5. /// <summary>
  6. /// 默认MIME映射器,可以根据文件扩展名获取标准内容类型。
  7. /// </summary>
  8. public class MimeMapper : IMimeMapper
  9. {
  10. /// <summary>
  11. /// 默认Mime - 如果没有找到任何其他映射则作为默认的Mime-Type
  12. /// </summary>
  13. public const string DefaultMime = "application/octet-stream";
  14. /// <summary>
  15. /// 在文件路径中搜索文件扩展名的默认正则表达式
  16. /// </summary>
  17. private readonly Regex _pathExtensionPattern = new Regex("\\.(\\w*)$");
  18. /// <summary>
  19. /// Mime类型与扩展名的映射字典(Content types)
  20. /// </summary>
  21. public static Dictionary<string, string> MimeTypes { get; } = new Dictionary<string, string>();
  22. /// <summary>
  23. /// mime类型与扩展名的映射关系
  24. /// </summary>
  25. public static Dictionary<string, string> ExtTypes { get; } = new Dictionary<string, string>();
  26. static MimeMapper()
  27. {
  28. foreach (var item in DefaultMimeItems.Items)
  29. {
  30. MimeTypes.AddOrUpdate("." + item.Extension, item.MimeType);
  31. ExtTypes.AddOrUpdate(item.MimeType, "." + item.Extension);
  32. }
  33. }
  34. /// <summary>
  35. ///
  36. /// </summary>
  37. public MimeMapper() : this(null)
  38. {
  39. }
  40. /// <summary>
  41. ///
  42. /// </summary>
  43. /// <param name="extensions"></param>
  44. public MimeMapper(params MimeMappingItem[] extensions)
  45. {
  46. Extend(extensions);
  47. }
  48. /// <summary>
  49. /// 扩展mime映射规则的标准列表。扩展的具有更高的优先级 - 如果扩展具有与标准项相同的扩展名,则会覆盖默认的mime
  50. /// </summary>
  51. /// <param name="extensions"></param>
  52. /// <returns></returns>
  53. public IMimeMapper Extend(params MimeMappingItem[] extensions)
  54. {
  55. if (extensions != null)
  56. {
  57. foreach (var mapping in extensions)
  58. {
  59. MimeTypes.AddOrUpdate(mapping.Extension, mapping.MimeType);
  60. ExtTypes.AddOrUpdate(mapping.MimeType, mapping.Extension);
  61. }
  62. }
  63. return this;
  64. }
  65. /// <summary>
  66. /// 返回特定文件扩展名的Content-Type,如果未找到任何对应关系,则返回默认值
  67. /// </summary>
  68. /// <param name="fileExtension"></param>
  69. /// <returns></returns>
  70. public string GetMimeFromExtension(string fileExtension)
  71. {
  72. fileExtension = (fileExtension ?? string.Empty).ToLower();
  73. return MimeTypes.ContainsKey(fileExtension) ? MimeTypes[fileExtension] : DefaultMime;
  74. }
  75. /// <summary>
  76. /// 返回特定Content-Type的文件扩展名,如果未找到任何对应关系,则返回空值
  77. /// </summary>
  78. /// <param name="mime"></param>
  79. /// <returns></returns>
  80. public string GetExtensionFromMime(string mime)
  81. {
  82. mime = (mime ?? string.Empty).ToLower();
  83. return ExtTypes.ContainsKey(mime) ? ExtTypes[mime] : "";
  84. }
  85. /// <summary>
  86. /// 根据路径获取MimeType
  87. /// </summary>
  88. /// <param name="path"></param>
  89. /// <returns></returns>
  90. public string GetMimeFromPath(string path)
  91. {
  92. var extension = GetExtension(path);
  93. return GetMimeFromExtension(extension);
  94. }
  95. /// <summary>
  96. /// 获取扩展名
  97. /// </summary>
  98. /// <param name="path"></param>
  99. /// <returns></returns>
  100. protected string GetExtension(string path)
  101. {
  102. var match = _pathExtensionPattern.Match(path ?? string.Empty);
  103. if (match.Groups.Count > 1)
  104. {
  105. return match.Groups[1].Value;
  106. }
  107. return null;
  108. }
  109. }
  110. }