![]() |
VOOZH | about |
dotnet add package ManagedCode.MimeTypes --version 10.0.7
NuGet\Install-Package ManagedCode.MimeTypes -Version 10.0.7
<PackageReference Include="ManagedCode.MimeTypes" Version="10.0.7" />
<PackageVersion Include="ManagedCode.MimeTypes" Version="10.0.7" />Directory.Packages.props
<PackageReference Include="ManagedCode.MimeTypes" />Project file
paket add ManagedCode.MimeTypes --version 10.0.7
#r "nuget: ManagedCode.MimeTypes, 10.0.7"
#:package ManagedCode.MimeTypes@10.0.7
#addin nuget:?package=ManagedCode.MimeTypes&version=10.0.7Install as a Cake Addin
#tool nuget:?package=ManagedCode.MimeTypes&version=10.0.7Install as a Cake Tool
<img src="https://raw.githubusercontent.com/managedcode/MimeTypes/main/logo.png" alt="MimeTypes logo" width="220">
👁 CI
👁 Release
👁 CodeQL
👁 Codecov
👁 NuGet
👁 NuGet downloads
👁 License
👁 .NET
ManagedCode.MimeTypes is a generated MIME/media type helper for .NET. It combines the IANA media types registry, Apache's maintained mime.types data, mime-db gap-fill entries, curated compatibility overrides, and registry metadata such as template URLs, references, extensions, and parseable magic-number prefixes.
Use it when you need to map file names to MIME types, inspect file content signatures, validate upload claims, classify MIME families, or keep an application aligned with the current public MIME registries.
dotnet add package ManagedCode.MimeTypes
Targets: net8.0, net9.0, and net10.0.
| Area | API examples | Notes |
|---|---|---|
| Extension lookup | GetMimeType("report.pdf") |
Handles file names, extensions, URLs, query strings, and multi-part extension candidates. |
| Reverse lookup | GetExtensions("image/jpeg") |
Returns known dot-prefixed extensions for a MIME value. |
| Registry metadata | TryGetMimeTypeInfo(...), GetKnownMimeTypes() |
Includes IANA registration status, template URLs, references, intended usage, aliases, and magic-number metadata. |
| Content detection | GetMimeTypeByContent(stream) |
Sniffs common signatures plus parseable registry magic prefixes. Seekable streams are restored to their original position. |
| Content validation | MatchesMimeTypeByContent(...), MatchesExtensionByContent(...) |
Checks whether detected bytes match an expected MIME type or the MIME implied by a file name. |
| Categorisation | GetMimeCategory(...), IsImage(...), IsJson(...) |
Groups MIME values into high-level families such as image, archive, script, document, spreadsheet, and executable. |
| Runtime mappings | RegisterMimeType(...), UnregisterMimeType(...) |
Allows application-specific extensions without regenerating the database. |
| Configuration and DI | SetDefaultMimeType(...), MimeHelper.Instance |
Configurable fallback MIME and an IMimeHelper adapter for common operations. |
using ManagedCode.MimeTypes;
var pdf = MimeHelper.GetMimeType("report.pdf");
var gzip = MimeHelper.GetMimeType("archive.tar.gz");
var avatar = MimeHelper.GetMimeType("https://cdn.example.com/users/42/avatar.png?v=2");
Console.WriteLine(pdf); // application/pdf
Console.WriteLine(gzip); // application/gzip
Console.WriteLine(avatar); // image/png
Unknown extensions return MimeHelper.DefaultMimeType, which defaults to application/octet-stream.
var fallback = MimeHelper.GetMimeType("file.unknown");
Console.WriteLine(fallback); // application/octet-stream
Extension lookup tells you what a file claims to be. Content detection inspects the first bytes and tells you what the payload looks like.
using ManagedCode.MimeTypes;
using var stream = File.OpenRead("report.pdf");
var detected = MimeHelper.GetMimeTypeByContent(stream);
Console.WriteLine(detected); // application/pdf
if (MimeHelper.TryGetMimeTypeByContent(stream, out var contentMime))
{
Console.WriteLine($"Detected by signature: {contentMime}");
}
GetMimeTypeByContent returns MimeHelper.DefaultMimeType when no known signature matches. TryGetMimeTypeByContent returns false in that case and still gives the fallback value through the out parameter.
Seekable streams are rewound to their original position after detection:
using var stream = File.OpenRead("image.png");
stream.Position = 4;
var detected = MimeHelper.GetMimeTypeByContent(stream);
Console.WriteLine(detected); // image/png
Console.WriteLine(stream.Position); // 4
Content detection is signature-based. It is useful for upload checks and mismatch detection, but it is not a full document parser, virus scanner, or guarantee that the entire file is structurally valid.
For upload flows, compare the detected content type with the declared MIME type or with the file extension.
using ManagedCode.MimeTypes;
using var stream = upload.OpenReadStream();
if (!MimeHelper.MatchesMimeTypeByContent(stream, upload.ContentType))
{
throw new InvalidOperationException("The uploaded file content does not match its declared MIME type.");
}
If you trust the file name as the expected claim:
using var stream = upload.OpenReadStream();
if (!MimeHelper.MatchesExtensionByContent(upload.FileName, stream))
{
throw new InvalidOperationException("The uploaded file content does not match its extension.");
}
There is also a file-path overload:
var ok = MimeHelper.MatchesExtensionByContent("/tmp/report.pdf");
The package ships generated metadata for known MIME values. This is useful when you need to display registry details, audit data sources, inspect aliases, or use IANA magic-number metadata.
using ManagedCode.MimeTypes;
if (MimeHelper.TryGetMimeTypeInfoByExtension("report.pdf", out var pdfInfo))
{
Console.WriteLine(pdfInfo.Mime); // application/pdf
Console.WriteLine(pdfInfo.IsIanaRegistered); // true
Console.WriteLine(pdfInfo.TemplateUrl); // https://www.iana.org/assignments/media-types/application/pdf
Console.WriteLine(pdfInfo.MagicSignatures.FirstOrDefault()?.Hex); // 25 50 44 46 2D
}
Lookup directly by MIME:
if (MimeHelper.TryGetMimeTypeInfo("application/json", out var jsonInfo))
{
Console.WriteLine(jsonInfo.Source);
Console.WriteLine(jsonInfo.PublishedSpecification);
}
List the bundled catalog:
var registeredImages = MimeHelper.GetKnownMimeTypes()
.Where(info => info.IsIanaRegistered && info.Mime.StartsWith("image/", StringComparison.OrdinalIgnoreCase))
.OrderBy(info => info.Mime)
.ToList();
MimeTypeInfo includes:
| Property | Meaning |
|---|---|
Mime |
Canonical MIME value known to the catalog. |
Extensions |
Dot-prefixed extensions associated with the MIME value. |
IsIanaRegistered |
Whether the type is registered in the IANA media types registry. |
IsObsolete / PreferredMime |
Obsolescence state and replacement when available. |
Template / TemplateUrl |
IANA registration template path and URL. |
Source |
Source that supplied the metadata, such as iana, apache, mime-db, or curated. |
Registered / Updated |
Registry dates when available. |
IntendedUsage, EncodingConsiderations, PublishedSpecification, Applications |
Template fields parsed from registry data. |
DeprecatedAliases / References |
Alias and reference metadata. |
MagicSignatures |
Parseable fixed byte prefixes from registration templates. |
GetMimeCategory maps a MIME value to a high-level MimeTypeCategory.
var category = MimeHelper.GetMimeCategory("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
Console.WriteLine(category); // Spreadsheet
if (MimeHelper.IsArchive("application/zip"))
{
Console.WriteLine("Archive upload");
}
if (MimeHelper.IsScript("application/x-powershell"))
{
Console.WriteLine("Treat this as executable script content");
}
Available categories:
Unknown, Video, Audio, Image, Document, Spreadsheet, Presentation, Pdf, Archive, Text, Json, Xml, Font, Model, Executable, Certificate, Calendar, Email, Script, Binary, Multipart, Message.
Predicate helpers are available for the main categories: IsVideo, IsAudio, IsImage, IsDocument, IsPdf, IsArchive, IsText, IsJson, IsXml, IsFont, IsModel, IsExecutable, IsCertificate, IsSpreadsheet, IsPresentation, IsCalendar, IsEmail, IsScript, and IsBinary.
var jpegExtensions = MimeHelper.GetExtensions("image/jpeg");
foreach (var extension in jpegExtensions)
{
Console.WriteLine(extension); // .jpe, .jpeg, .jpg
}
if (MimeHelper.TryGetExtensions("application/pdf", out var pdfExtensions))
{
Console.WriteLine(string.Join(", ", pdfExtensions)); // .pdf
}
Applications can add or replace extension mappings at runtime.
MimeHelper.RegisterMimeType("acme", "application/x-acme");
var custom = MimeHelper.GetMimeType("invoice.acme");
Console.WriteLine(custom); // application/x-acme
MimeHelper.UnregisterMimeType("acme");
Runtime registrations update extension lookup and reverse lookup, but they do not create generated registry metadata:
MimeHelper.RegisterMimeType("internal", "application/x-company-internal");
Console.WriteLine(MimeHelper.GetMimeType("file.internal")); // application/x-company-internal
Console.WriteLine(MimeHelper.TryGetMimeTypeInfoByExtension("file.internal", out _)); // false
MimeHelper.UnregisterMimeType("internal");
The helper uses immutable dictionaries internally so lookup remains safe while mappings are updated.
The default fallback is application/octet-stream.
Console.WriteLine(MimeHelper.DefaultMimeType); // application/octet-stream
MimeHelper.SetDefaultMimeType(MimeHelper.JSON);
Console.WriteLine(MimeHelper.GetMimeType("unknown.extension")); // application/json
MimeHelper.SetDefaultMimeType(MimeHelper.BIN);
Use this carefully in shared applications because it changes process-wide behavior.
For code that prefers an interface, use MimeHelper.Instance.
using ManagedCode.MimeTypes;
public sealed class UploadClassifier(IMimeHelper mimeHelper)
{
public string GetClaimedMime(string fileName)
{
return mimeHelper.GetMimeType(fileName);
}
}
services.AddSingleton<IMimeHelper>(MimeHelper.Instance);
IMimeHelper covers common operations: extension lookup, content lookup, reverse lookup, runtime registration, unregistration, and categorisation. The static MimeHelper class exposes the full metadata and validation surface.
The generated database is built from:
| Source | Purpose |
|---|---|
| IANA media types registry | Official media type registrations and templates. |
Apache mime.types |
Broad extension coverage used by common web server deployments. |
| mime-db | Compatibility gap-fill entries used by the JavaScript and web tooling ecosystem. |
curatedMimeTypes.json |
Project-maintained overrides for practical compatibility cases. |
Curated compatibility mappings and maintained runtime/server maps take precedence over raw IANA extension hints when they conflict. IANA remains the source for registration metadata.
The sync utility regenerates mimeTypes.json and mimeTypes.metadata.json.
dotnet run --project ManagedCode.MimeTypes.Sync
Provide custom inputs or outputs:
DOTNET_CLI_TELEMETRY_OPTOUT=1 dotnet run --project ManagedCode.MimeTypes.Sync -- \
--iana-source https://www.iana.org/assignments/media-types/media-types.xml \
--output ./artifacts/mimeTypes.json \
--metadata-output ./artifacts/mimeTypes.metadata.json
Preserve an existing local map only when intentionally carrying compatibility data forward:
dotnet run --project ManagedCode.MimeTypes.Sync -- --preserve-existing --prefer-remote
Disable or replace the curated compatibility layer for policy experiments:
dotnet run --project ManagedCode.MimeTypes.Sync -- --no-curated
dotnet run --project ManagedCode.MimeTypes.Sync -- --curated-source ./my-curated-mime-types.json
Running the tool updates the JSON inputs. The source generator consumes those files on the next build and regenerates the helper constants, mappings, and metadata.
dotnet restore
dotnet build ManagedCode.MimeTypes.sln
dotnet test ManagedCode.MimeTypes.sln
The release workflow reads the package version from Directory.Build.props, packs the project, publishes to NuGet on main, and creates the GitHub release/tag when publishing succeeds.
Issues and pull requests are welcome. Please run dotnet test ManagedCode.MimeTypes.sln before sending changes. For catalog updates, prefer the sync utility so generated MIME data and metadata stay reproducible.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 net8.0 is compatible. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 is compatible. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
Showing the top 5 NuGet packages that depend on ManagedCode.MimeTypes:
| Package | Downloads |
|---|---|
|
ManagedCode.Storage.Core
Base interfaces for ManagedCode.StorageS |
|
|
ManagedCode.Storage.FileSystem
Storage for FileSystem |
|
|
ManagedCode.Storage.AspNetExtensions
Extensions for ASP.NET for Storage |
|
|
ManagedCode.MarkItDown
ManagedCode.MarkItDown converts documents, archives, and URLs into Markdown optimised for LLM and search workflows. Supports HTML, PDF, Office Open XML, EPUB, CSV, JSON, feeds, images, audio, and more with async-first APIs. |
|
|
ManagedCode.Storage.Server
Extensions for ASP.NET for Storage |
Showing the top 1 popular GitHub repositories that depend on ManagedCode.MimeTypes:
| Repository | Stars |
|---|---|
|
managedcode/Storage
Storage library provides a universal interface for accessing and manipulating data in different cloud blob storage providers
|
| Version | Downloads | Last Updated |
|---|---|---|
| 10.0.7 | 2,311 | 5/21/2026 |
| 10.0.6 | 92 | 5/21/2026 |
| 10.0.5 | 1,231 | 5/13/2026 |
| 10.0.4 | 489 | 5/11/2026 |
| 10.0.2 | 105 | 5/11/2026 |
| 10.0.1 | 24,847 | 11/18/2025 |
| 1.0.7 | 3,365 | 11/3/2025 |
| 1.0.6 | 269 | 11/2/2025 |
| 1.0.5 | 2,955 | 10/14/2025 |
| 1.0.4 | 242 | 10/12/2025 |
| 1.0.3 | 5,426 | 7/30/2025 |
| 1.0.2 | 9,913 | 2/6/2025 |
| 1.0.0 | 71,393 | 5/6/2022 |