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
其它
看到 How can I determine file type without an extension on Windows? - Super User ,
有個疑問,根據文件內容獲取文件的類型/MIME type,本質上是不靠譜的?只能靠猜?只是對大部分常見文件類型,有固定格式而已?
畢竟文件內容是什么,開發者是可以任意控制的。