如何从文件扩展名中获得MIME类型?
当前回答
ASP。NET或其他
在ASP中,选项发生了一些变化。NET Core,在这里(学分):
新FileExtensionContentTypeProvider()。TryGetContentType(文件名,输出内容类型);(仅vNext) 从未测试过,但看起来您可以通过公开的Mappings属性正式展开mime类型列表。 使用MimeTypes NuGet包 从.NET Framework的引用源中复制mimemaps文件
对于。net Framework >= 4.5:
使用System.Web.MimeMapping.GetMimeMapping方法,这是.NET Framework 4.5中BCL的一部分:
string mimeType = MimeMapping.GetMimeMapping(fileName);
如果你需要添加自定义映射,你可以使用反射来向BCL MimeMapping类添加映射,它使用一个自定义字典来公开这个方法,所以你应该调用下面的方法来添加映射(从未测试过,但应该问题。工作)。
无论如何,当使用反射来添加MIME类型时,要注意,由于您正在访问私有字段,因此它的名称可能会更改甚至完全被删除,因此您应该格外谨慎,添加双重检查并为每一步提供故障安全操作。
MimeMapping._mappingDictionary.AddMapping(string fileExtension, string mimeType)
其他回答
受到塞缪尔回答的启发,我写了一个改进版本:
当扩展名是大写时也适用。 以文件名为输入,优雅地处理没有扩展名的文件。 不要在键中包含“。”。 列表,为此我编写了一个小型转换脚本。
最终的源代码超过30K个字符,所以我不能张贴在这里,在Github上检查它。
FileExtension处理文件扩展名,而不是Mime。用户可以更改文件扩展名,因此请检查Mime。代码示例通过文件扩展名关联Mime,这是错误的,不能工作。
需要获取内容类型文件,并检查表Mime contetType该文件根据文件扩展名。现在,如何获得文件的内容类型?
使用FileUpload是这样的: 现在,如果我已经有文件,捕捉你的ContentType?
由文件扩展名计算的mime类型不一定总是正确的。
让我们说,我可以保存一个文件的。png扩展名,但文件格式,我可以设置为“ImageFormat.jpeg”。
所以在这种情况下,你要计算的文件会给出不同的结果…这可能会导致文件比原始文件大。
如果你正在处理图像,那么你可以使用imagecodecInfo和ImageFormat。
您不应该信任来自客户端的文件扩展名。总是检查文件的神奇数字。
使用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;
}
推荐文章
- 实体框架核心:在上一个操作完成之前,在此上下文中开始的第二个操作
- 如何为构造函数定制Visual Studio的私有字段生成快捷方式?
- 如何使用JSON确保字符串是有效的JSON。网
- AppSettings从.config文件中获取值
- 通过HttpClient向REST API发布一个空体
- 如何检查IEnumerable是否为空或空?
- 自动化invokerrequired代码模式
- 在c#代码中设置WPF文本框的背景颜色
- 在c#中,什么是单子?
- c#和Java中的泛型有什么不同?和模板在c++ ?
- c#线程安全快速(est)计数器
- 如何将此foreach代码转换为Parallel.ForEach?
- 如何分裂()一个分隔字符串到一个列表<字符串>
- 如何转换列表<字符串>列表<int>?
- c#对象列表,我如何得到一个属性的和