-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMimeTypesHandler.cs
More file actions
100 lines (90 loc) · 3.8 KB
/
MimeTypesHandler.cs
File metadata and controls
100 lines (90 loc) · 3.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System.Collections.Concurrent;
using MimeTypesMapper.Infrastructure;
namespace MimeTypesMapper
{
public sealed class MimeTypesHandler
{
private static readonly Lazy<MimeTypesHandler> _lazyLoader =
new(() => new MimeTypesHandler(), LazyThreadSafetyMode.ExecutionAndPublication);
private readonly ConcurrentDictionary<string, string> _mimeTypes;
private MimeTypesHandler()
{
_mimeTypes = new ConcurrentDictionary<string, string>(
StringComparer.InvariantCultureIgnoreCase
);
LoadDefaultMimeTypes();
}
public static MimeTypesHandler Instance => _lazyLoader.Value;
private void LoadDefaultMimeTypes()
{
// Default MIME types
_mimeTypes.TryAdd(".pdf", "application/pdf");
_mimeTypes.TryAdd(".jpg", "image/jpeg");
_mimeTypes.TryAdd(".jpeg", "image/jpeg");
_mimeTypes.TryAdd(".png", "image/png");
_mimeTypes.TryAdd(".doc", "application/msword");
_mimeTypes.TryAdd(
".docx",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document"
);
_mimeTypes.TryAdd(".xls", "application/vnd.ms-excel");
_mimeTypes.TryAdd(
".xlsx",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
);
// Additional MIME types
_mimeTypes.TryAdd(".html", "text/html");
_mimeTypes.TryAdd(".htm", "text/html");
_mimeTypes.TryAdd(".css", "text/css");
_mimeTypes.TryAdd(".js", "application/javascript");
_mimeTypes.TryAdd(".json", "application/json");
_mimeTypes.TryAdd(".xml", "application/xml");
_mimeTypes.TryAdd(".txt", "text/plain");
_mimeTypes.TryAdd(".csv", "text/csv");
_mimeTypes.TryAdd(".zip", "application/zip");
_mimeTypes.TryAdd(".tar", "application/x-tar");
_mimeTypes.TryAdd(".rar", "application/x-rar-compressed");
_mimeTypes.TryAdd(".gif", "image/gif");
_mimeTypes.TryAdd(".bmp", "image/bmp");
_mimeTypes.TryAdd(".tif", "image/tiff");
_mimeTypes.TryAdd(".tiff", "image/tiff");
_mimeTypes.TryAdd(".mp3", "audio/mpeg");
_mimeTypes.TryAdd(".wav", "audio/wav");
_mimeTypes.TryAdd(".mp4", "video/mp4");
_mimeTypes.TryAdd(".avi", "video/x-msvideo");
_mimeTypes.TryAdd(".mov", "video/quicktime");
_mimeTypes.TryAdd(".wmv", "video/x-ms-wmv");
_mimeTypes.TryAdd(".flv", "video/x-flv");
}
public string GetMimeType(string filePath)
{
if (string.IsNullOrWhiteSpace(filePath))
{
throw new MimeTypesException("File path cannot be null or empty.");
}
var extension = Path.GetExtension(filePath).ToLowerInvariant();
if (_mimeTypes.TryGetValue(extension, out var mimeType))
{
return mimeType;
}
return "application/octet-stream";
}
public void AddOrUpdateMimeType(string extension, string mimeType)
{
if (string.IsNullOrWhiteSpace(extension))
{
throw new MimeTypesException("Extension cannot be null or empty.");
}
if (string.IsNullOrWhiteSpace(mimeType))
{
throw new MimeTypesException("MIME type cannot be null or empty.");
}
_mimeTypes.AddOrUpdate(
extension.ToLowerInvariant(),
mimeType,
(key, oldValue) => mimeType
);
MimeTypesLogger.Log($"MIME type for {extension} updated to {mimeType}");
}
}
}