MIME Type 为何物:
MIME 参考手册
svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
常规方式
对于有文件后缀名的,可以使用 MimeMapping.GetMimeMapping 获取。
MimeMapping.GetMimeMapping(String) Method (System.Web) | Microsoft Docs
如果 MimeMapping.GetMimeMapping 不认识的,会返回 application/octet-stream
这个默认值。
其它方式
对于特定的类型的文件,可以使用与之相关的其它方式获取,如 Image ,可以这样获取:
public bool TryBuildFileMimeType(string filePath, out string mimeType){ if (string.IsNullOrWhiteSpace(filePath) || !System.IO.File.Exists(filePath)) { mimeType = string.Empty; return false; } try { var image = Image.FromFile(filePath); mimeType = GetMimeTypeFromImage(image); return !string.IsNullOrWhiteSpace(mimeType); } catch (Exception ex) { mimeType = string.Empty; return false; }}
private string GetMimeTypeFromImage(Image image){ if (image.RawFormat.Equals(ImageFormat.Jpeg)) return "image/jpeg"; else if (image.RawFormat.Equals(ImageFormat.Bmp)) return "image/bmp"; else if (image.RawFormat.Equals(ImageFormat.Emf)) return "image/emf"; else if (image.RawFormat.Equals(ImageFormat.Exif)) return "image/exif"; else if (image.RawFormat.Equals(ImageFormat.Gif)) return "image/gif"; else if (image.RawFormat.Equals(ImageFormat.Icon)) return "image/icon"; else if (image.RawFormat.Equals(ImageFormat.Png)) return "image/png"; else if (image.RawFormat.Equals(ImageFormat.Tiff)) return "image/tiff"; else if (image.RawFormat.Equals(ImageFormat.Wmf)) return "image/wmf"; return string.Empty;}
在我这里的实际场景中,大部分文件都有后缀名,即可以用 MimeMapping 处理,对于没有后缀名的,都是图片文件,可以用后面这种方式处理。
当然,还可以根据文件头内容,先获取文件类型,在找到对应的 MIME Type 。但这个需要自己维护一个文件头标识的表,不知道有没有现成的 NUGET 可以用,求推荐。
相关工具
5 Tools To Help Identify Unrecognized or Unknown File Types • Raymond.CC
ExifTool 这个工具很强大,可以看很多文件元数据信息,有命令行版本和 GUI 版本。
ExifTool by Phil Harvey
ExifToolGUI
Detect-It-Easy
horsicq/Detect-It-Easy:用于确定 Windows、Linux 和 MacOS 文件类型的程序
其它
看到 How can I determine file type without an extension on Windows? - Super User , 有个疑问,根据文件内容获取文件的类型/MIME type,本质上是不靠谱的?只能靠猜?只是对大部分常见文件类型,有固定格式而已?
毕竟文件内容是什么,开发者是可以任意控制的。
参考链接或相关链接
- c# - Get ImageFormat from System.Drawing.Image.RawFormat - Stack Overflow
- c# - Guessing a file type based on its content - Code Review Stack Exchange
- .NET获取文件的MIME类型(Content Type)
- Get a File Content-Type / MIME-type from file extension in ASP.NET C#
- NuGet Gallery | MimeMapping 1.0.1.17
原文链接: https://blog.jgrass.cc/posts/csharp-mime-type/
本作品采用 「署名 4.0 国际」 许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。