如何从文件扩展名中获得MIME类型?
当前回答
为了使这篇文章更全面,对于。net核心开发人员有FileExtensionContentTypeProvider类,它涵盖了官方的MIME内容类型。
它在幕后工作——根据文件扩展名在Http响应头中设置ContentType。
如果您需要特殊的MIME类型,请参阅自定义MIME类型的示例:
public void Configure(IApplicationBuilder app)
{
// Set up custom content types -associating file extension to MIME type
var provider = new FileExtensionContentTypeProvider();
// Add new mappings
provider.Mappings[".myapp"] = "application/x-msdownload";
provider.Mappings[".htm3"] = "text/html";
provider.Mappings[".image"] = "image/png";
// Replace an existing mapping
provider.Mappings[".rtf"] = "application/x-msdownload";
// Remove MP4 videos.
provider.Mappings.Remove(".mp4");
app.UseStaticFiles(new StaticFileOptions()
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot", "images")),
RequestPath = new PathString("/MyImages"),
ContentTypeProvider = provider
});
app.UseDirectoryBrowser(new DirectoryBrowserOptions()
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot", "images")),
RequestPath = new PathString("/MyImages")
});
}
其他回答
您可以使用Apache的httpd提供的表。将其映射到函数、字典、列表等应该是很简单的。
另外,正如这里所看到的,extension->mime类型不一定是函数。每个文件扩展名可能有多种常见的MIME类型,所以你应该看看你的应用程序的需求,看看你为什么关心MIME类型,你想用它们“做什么”等等。您可以使用文件扩展名来确定相同的行为吗?您是否也需要读取文件的前几个字节来确定其MIME类型?
您不应该信任来自客户端的文件扩展名。总是检查文件的神奇数字。
使用filetpe讯问器与ASP。NET核心:
public static class FileTypeChecker
{
private static List<string> validVideoMimeTypes = new List<string> { "video/mp4", "video/quicktime" };
private static List<string> validImageMimeTypes = new List<string> { "image/png", "image/jpeg" };
public static bool IsValidVideo(IFormFile file)
{
return validVideoMimeTypes.Contains(GetFileMimeType(file));
}
public static bool IsValidImage(IFormFile file)
{
return validImageMimeTypes.Contains(GetFileMimeType(file));
}
private static string GetFileMimeType(IFormFile file)
{
// You should have checked for null and file length before reaching here
IFileTypeInterrogator interrogator = new FileTypeInterrogator.FileTypeInterrogator();
byte[] fileBytes;
using (var stream = new MemoryStream())
{
file.CopyTo(stream);
fileBytes = stream.ToArray();
}
FileTypeInfo fileTypeInfo = interrogator.DetectType(fileBytes);
return fileTypeInfo.MimeType.ToLower();
}
}
在你的控制器或服务内部:
public IActionResult UploadVideo([FromForm] UploadVideoVM model)
{
if (model.File.Length < minimumLength || model.File.Length > maximumLength)
{
// BadRequest => Size
}
else if (!FileTypeChecker.IsValidVideo(model.File))
{
// BadRequest => Type
}
else
{
// All good
}
return Ok();
}
要获得文件扩展名的MIME类型,请参考此文件。
.NET Core获取MimeType的方法:
添加依赖关系
Microsoft.AspNetCore.StaticFiles
private string GetMimeType(string fileName)
{
var provider = new FileExtensionContentTypeProvider();
if (!provider.TryGetContentType(fileName, out var contentType))
{
contentType = "application/octet-stream";
}
return contentType;
}
由文件扩展名计算的mime类型不一定总是正确的。
让我们说,我可以保存一个文件的。png扩展名,但文件格式,我可以设置为“ImageFormat.jpeg”。
所以在这种情况下,你要计算的文件会给出不同的结果…这可能会导致文件比原始文件大。
如果你正在处理图像,那么你可以使用imagecodecInfo和ImageFormat。
我对这些mimetypes的理解,使用apache列表,下面的脚本将为您提供一个包含所有mimetypes的字典。
var mimeTypeListUrl = "http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types";
var webClient = new WebClient();
var rawData = webClient.DownloadString(mimeTypeListUrl).Split(new[] { Environment.NewLine, "\n" }, StringSplitOptions.RemoveEmptyEntries);
var extensionToMimeType = new Dictionary<string, string>();
var mimeTypeToExtension = new Dictionary<string, string[]>();
foreach (var row in rawData)
{
if (row.StartsWith("#")) continue;
var rowData = row.Split(new[] { "\t" }, StringSplitOptions.RemoveEmptyEntries);
if (rowData.Length != 2) continue;
var extensions = rowData[1].Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);
if (!mimeTypeToExtension.ContainsKey(rowData[0]))
{
mimeTypeToExtension.Add(rowData[0], extensions);
}
foreach (var extension in extensions)
{
if (!extensionToMimeType.ContainsKey(extension))
{
extensionToMimeType.Add(extension, rowData[0]);
}
}
}
推荐文章
- 最好的方法在asp.net强制https为整个网站?
- 在ASP .NET身份声明是什么
- 将字符串转换为System.IO.Stream
- 如何从枚举中选择一个随机值?
- 驻留在App_Code中的类不可访问
- 在链式LINQ扩展方法调用中等价于'let'关键字的代码
- dynamic (c# 4)和var之间的区别是什么?
- Visual Studio: ContextSwitchDeadlock
- 返回文件在ASP。Net Core Web API
- 自定义HttpClient请求头
- 无法启动IIS Express Web服务器,注册URL失败,访问被拒绝
- 如果我使用OWIN Startup.cs类并将所有配置移动到那里,我是否需要一个Global.asax.cs文件?
- ASP。NET Identity DbContext混淆
- VS2013外部构建错误"error MSB4019: The imported project <path> was not found"
- 从另一个列表id中排序一个列表