如何在 .NET 中确定文件的内容类型?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/691212/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do I determine a file's content type in .NET?
提问by Zack Peterson
My WPF application gets a file from the user with Microsoft.Win32.OpenFileDialog()...
我的 WPF 应用程序使用 Microsoft.Win32.OpenFileDialog() 从用户那里获取文件...
Private Sub ButtonUpload_Click(...)
Dim FileOpenStream As Stream = Nothing
Dim FileBox As New Microsoft.Win32.OpenFileDialog()
FileBox.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
FileBox.Filter = "Pictures (*.jpg;*.jpeg;*.gif;*.png)|*.jpg;*.jpeg;*.gif;*.png|" & _
"Documents (*.pdf;*.doc;*.docx;)|*.pdf;*.doc;*.docx;|" & _
"All Files (*.*)|*.*"
FileBox.FilterIndex = 1
FileBox.Multiselect = False
Dim FileSelected As Nullable(Of Boolean) = FileBox.ShowDialog(Me)
If FileSelected IsNot Nothing AndAlso FileSelected.Value = True Then
Try
FileOpenStream = FileBox.OpenFile()
If (FileOpenStream IsNot Nothing) Then
Dim ByteArray As Byte()
Using br As New BinaryReader(FileOpenStream)
ByteArray = br.ReadBytes(FileOpenStream.Length)
End Using
Dim z As New ZackFile
z.Id = Guid.NewGuid
z.FileData = ByteArray
z.FileSize = CInt(ByteArray.Length)
z.FileName = FileBox.FileName.Split("\").Last
z.DateAdded = Now
db.AddToZackFile(z)
db.SaveChanges()
End If
Catch Ex As Exception
MessageBox.Show("Cannot read file from disk. " & Ex.Message, "Fail", MessageBoxButton.OK, MessageBoxImage.Error)
Finally
If (FileOpenStream IsNot Nothing) Then
FileOpenStream.Close()
End If
End Try
End If
End Sub
And my ASP.NET MVC application serves it up for download at a web site with FileStreamResult()...
我的 ASP.NET MVC 应用程序使用 FileStreamResult() 在网站上提供下载...
Public Class ZackFileController
Inherits System.Web.Mvc.Controller
Function Display(ByVal id As Guid) As FileStreamResult
Dim db As New EfrDotOrgEntities
Dim Model As ZackFile = (From z As ZackFile In db.ZackFile _
Where z.Id = id _
Select z).First
Dim ByteArray As Byte() = Model.ImageData
Dim FileStream As System.IO.MemoryStream = New System.IO.MemoryStream(ByteArray)
Dim ContentType As String = ?????
Dim f As New FileStreamResult(FileStream, ContentType)
f.FileDownloadName = Model.FileName
Return f
End Function
End Class
But FileStreamResult() needs a content type string. How do I know the correct content type of my file?
但是 FileStreamResult() 需要一个内容类型字符串。我如何知道我的文件的正确内容类型?
回答by jones6
There is a MimeMapping class in .NET 4.5
.NET 4.5 中有一个 MimeMapping 类
http://msdn.microsoft.com/en-us/library/system.web.mimemapping.aspx
http://msdn.microsoft.com/en-us/library/system.web.mimemapping.aspx
回答by Zack Peterson
I've replaced the FileExtension column in my database table with a ContentType column.
我已将数据库表中的 FileExtension 列替换为 ContentType 列。
I populate it when I upload a file.
我在上传文件时填充它。
Private Sub ButtonUpload_Click(...)
...
Dim FileExtension As String = "." + FileBox.FileName.Split(".").Last.ToLower
z.ContentType = ContentType(FileExtension)
...
End Sub
I determine the content type with this function:
我用这个函数确定内容类型:
Function ContentType(ByVal FileExtension As String) As String
Dim d As New Dictionary(Of String, String)
'Images'
d.Add(".bmp", "image/bmp")
d.Add(".gif", "image/gif")
d.Add(".jpeg", "image/jpeg")
d.Add(".jpg", "image/jpeg")
d.Add(".png", "image/png")
d.Add(".tif", "image/tiff")
d.Add(".tiff", "image/tiff")
'Documents'
d.Add(".doc", "application/msword")
d.Add(".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document")
d.Add(".pdf", "application/pdf")
'Slideshows'
d.Add(".ppt", "application/vnd.ms-powerpoint")
d.Add(".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation")
'Data'
d.Add(".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
d.Add(".xls", "application/vnd.ms-excel")
d.Add(".csv", "text/csv")
d.Add(".xml", "text/xml")
d.Add(".txt", "text/plain")
'Compressed Folders'
d.Add(".zip", "application/zip")
'Audio'
d.Add(".ogg", "application/ogg")
d.Add(".mp3", "audio/mpeg")
d.Add(".wma", "audio/x-ms-wma")
d.Add(".wav", "audio/x-wav")
'Video'
d.Add(".wmv", "audio/x-ms-wmv")
d.Add(".swf", "application/x-shockwave-flash")
d.Add(".avi", "video/avi")
d.Add(".mp4", "video/mp4")
d.Add(".mpeg", "video/mpeg")
d.Add(".mpg", "video/mpeg")
d.Add(".qt", "video/quicktime")
Return d(FileExtension)
End Function
This works, but it seems inelegant.
这有效,但似乎不优雅。
回答by Zack Peterson
I use a custom config section in web.config (I leave the task for writing the custom configuration section to you):
我在 web.config 中使用自定义配置部分(我将编写自定义配置部分的任务留给您):
<configSections>
<section name="mimeTypeMappings" type="MySoftwareLol.MimeTypeMappingSection, MySoftwareLol"/>
</configSections>
<mimeTypeMappings>
<MimeTypes>
<MimeType Type="application/mac-binhex40" Extensions=".hqx"/>
<MimeType Type="application/msword" Extensions=".doc"/>
<MimeType Type="application/pdf" Extensions=".pdf"/>
<MimeType Type="application/postscript" Extensions=".ai;.eps;.ps"/>
<MimeType Type="application/rtf" Extensions=".rtf"/>
<MimeType Type="application/vnd.ms-excel" Extensions=".xla;.xlc;.xlm;.xls;.xlt;.xlw"/>
<MimeType Type="application/vnd.ms-outlook" Extensions=".msg"/>
<MimeType Type="application/vnd.ms-powerpoint" Extensions=".pot;.pps;.ppt"/>
<MimeType Type="application/vnd.ms-works" Extensions=".wcm;.wdb;.wks;.wps"/>
<MimeType Type="application/x-compress" Extensions=".z"/>
<MimeType Type="application/x-compressed" Extensions=".tgz"/>
<MimeType Type="application/x-gzip" Extensions=".gz"/>
<MimeType Type="application/x-msaccess" Extensions=".mdb"/>
<MimeType Type="application/x-msmetafile" Extensions=".wmf"/>
<MimeType Type="application/x-mspublisher" Extensions=".pub"/>
<MimeType Type="application/x-msschedule" Extensions=".scd"/>
<MimeType Type="application/x-msterminal" Extensions=".trm"/>
<MimeType Type="application/x-mswrite" Extensions=".wri"/>
<MimeType Type="application/x-tar" Extensions=".tar"/>
<MimeType Type="application/zip" Extensions=".zip"/>
<MimeType Type="audio/basic" Extensions=".au;.snd"/>
<MimeType Type="audio/mid" Extensions=".mid;.rmi"/>
<MimeType Type="audio/mpeg" Extensions=".mp3"/>
<MimeType Type="audio/x-aiff" Extensions=".aif;.aifc;.aiff"/>
<MimeType Type="audio/x-pn-realaudio" Extensions=".ra;.ram"/>
<MimeType Type="audio/x-wav" Extensions=".wav"/>
<MimeType Type="image/bmp" Extensions=".bmp"/>
<MimeType Type="image/gif" Extensions=".gif"/>
<MimeType Type="image/jpeg" Extensions=".jpe;.jpeg;.jpg"/>
<MimeType Type="image/pipeg" Extensions=".jfif"/>
<MimeType Type="image/tiff" Extensions=".tif;.tiff"/>
<!--By default, sends HTML documents as plain text; sending it as text/html may pose security risks-->
<!--If you wish to accept the risks, uncomment the following two lines and comment out the third.-->
<!--<MimeType Type="text/html" Extensions=".mht;.html;.htm"/>-->
<!--<MimeType Type="text/plain" Extensions=".txt"/>-->
<MimeType Type="text/plain" Extensions=".txt;.html;.htm"/>
<MimeType Type="text/richtext" Extensions=".rtx"/>
<MimeType Type="text/tab-separated-values" Extensions=".tsv"/>
<MimeType Type="video/mpeg" Extensions=".mp2;.mpa;.mpe;.mpeg;.mpg;.mpv2"/>
<MimeType Type="video/quicktime" Extensions=".mov;.qt"/>
<MimeType Type="video/x-la-asf" Extensions=".lsf;.lsx;.asf;.asr;.asx;"/>
<MimeType Type="video/x-msvideo" Extensions=".avi"/>
</MimeTypes>
</mimeTypeMappings>
I use Path.GetExtension() and map that to one of the types listed in Extensions.
我使用 Path.GetExtension() 并将其映射到扩展中列出的类型之一。
回答by André Pena
I made a C# helper class based on Zacks response.
我根据 Zacks 响应制作了一个 C# 帮助器类。
/// <summary>
/// Helps with Mime Types
/// </summary>
public static class MimeTypesHelper
{
/// <summary>
/// Returns the content type based on the given file extension
/// </summary>
public static string GetContentType(string fileExtension)
{
var mimeTypes = new Dictionary<String, String>
{
{".bmp", "image/bmp"},
{".gif", "image/gif"},
{".jpeg", "image/jpeg"},
{".jpg", "image/jpeg"},
{".png", "image/png"},
{".tif", "image/tiff"},
{".tiff", "image/tiff"},
{".doc", "application/msword"},
{".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"},
{".pdf", "application/pdf"},
{".ppt", "application/vnd.ms-powerpoint"},
{".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"},
{".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},
{".xls", "application/vnd.ms-excel"},
{".csv", "text/csv"},
{".xml", "text/xml"},
{".txt", "text/plain"},
{".zip", "application/zip"},
{".ogg", "application/ogg"},
{".mp3", "audio/mpeg"},
{".wma", "audio/x-ms-wma"},
{".wav", "audio/x-wav"},
{".wmv", "audio/x-ms-wmv"},
{".swf", "application/x-shockwave-flash"},
{".avi", "video/avi"},
{".mp4", "video/mp4"},
{".mpeg", "video/mpeg"},
{".mpg", "video/mpeg"},
{".qt", "video/quicktime"}
};
// if the file type is not recognized, return "application/octet-stream" so the browser will simply download it
return mimeTypes.ContainsKey(fileExtension) ? mimeTypes[fileExtension] : "application/octet-stream";
}
}
You might, of course, want to keep the mimeTypesalive for future queries. This is just a starting point.
当然,您可能希望保持mimeTypes活动状态以备将来查询。这只是一个起点。
回答by MrDebnath
can be easily done by using registry keys.
可以通过使用注册表项轻松完成。
Dim regKey As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey("extension")
If Not regKey Is Nothing Then
Dim ct As Object = regKey.GetValue("Content Type")
If Not ct Is Nothing Then
Return ct.ToString()
End If
End If
This will produce the same result as the big list mentioned above!!!!
这将产生与上面提到的大列表相同的结果!!!!
回答by CodingWithSpike
It looks like you still have the filename when you go to set the content type. You could pick the correct mime type for the file extension, or default to something like "application/base64".
当您去设置内容类型时,您似乎还有文件名。您可以为文件扩展名选择正确的 mime 类型,或默认为“application/base64”之类的内容。
Assuming the person downloading it will be using a web browser, try to stick to the common ones: MIME Types Known By IE
回答by Green Fire
You can use Thislist, that contains 684 file extensions.
您可以使用此列表,其中包含 684 个文件扩展名。
In this list every pairis separated by "~", and every pair has the extension name and the content type separated by "#".
在这个列表中,每一对都用“~”分隔,每一对都有扩展名和内容类型,用“#”分隔。
I dont know what language are you using but this is in vb.net
我不知道你用的是什么语言,但这是在 vb.net 中
How to use it:
如何使用它:
- Add a string resource to you project that contains the list.
It will look like this -

Add this class to your project (that will parse the string to Dictionary)
Public Class MIMETypeList Public data As Dictionary(Of String, String) Public Sub New() data = New Dictionary(Of String, String)() Dim Temp() As String For Each TypeConvertion As String In My.Resources.MimeType.Split("~") Temp = TypeConvertion.Split("#") If Not data.ContainsKey(Temp(0)) Then data.Add(Temp(0), Temp(1)) End If Next End Sub End ClassNow you can use it like this:
Dim FileExtension1 As String = ".mp4" Dim FileExtension2 As String = ".html" Dim FileExtension3 As String = ".Random" Dim Converter As New MIMETypeList If Converter.data.ContainsKey(FileExtension1) Then Debug.WriteLine(FileExtension1 & " -> " & Converter.data.Item(FileExtension1)) Else Debug.WriteLine(FileExtension1 & " -> File Content Not Found") End If If Converter.data.ContainsKey(FileExtension2) Then Debug.WriteLine(FileExtension2 & " -> " & Converter.data.Item(FileExtension2)) Else Debug.WriteLine(FileExtension2 & " -> File Content Not Found") End If If Converter.data.ContainsKey(FileExtension3) Then Debug.WriteLine(FileExtension3 & " -> " & Converter.data.Item(FileExtension3)) Else Debug.WriteLine(FileExtension3 & " -> File Content Not Found") End IfOutput:
.mp4 -> video/mp4
.html -> text/html
.Random -> File Content Not Found
- 向包含列表的项目添加字符串资源。它看起来像这样 -

将此类添加到您的项目中(将字符串解析为字典)
Public Class MIMETypeList Public data As Dictionary(Of String, String) Public Sub New() data = New Dictionary(Of String, String)() Dim Temp() As String For Each TypeConvertion As String In My.Resources.MimeType.Split("~") Temp = TypeConvertion.Split("#") If Not data.ContainsKey(Temp(0)) Then data.Add(Temp(0), Temp(1)) End If Next End Sub End Class现在你可以像这样使用它:
Dim FileExtension1 As String = ".mp4" Dim FileExtension2 As String = ".html" Dim FileExtension3 As String = ".Random" Dim Converter As New MIMETypeList If Converter.data.ContainsKey(FileExtension1) Then Debug.WriteLine(FileExtension1 & " -> " & Converter.data.Item(FileExtension1)) Else Debug.WriteLine(FileExtension1 & " -> File Content Not Found") End If If Converter.data.ContainsKey(FileExtension2) Then Debug.WriteLine(FileExtension2 & " -> " & Converter.data.Item(FileExtension2)) Else Debug.WriteLine(FileExtension2 & " -> File Content Not Found") End If If Converter.data.ContainsKey(FileExtension3) Then Debug.WriteLine(FileExtension3 & " -> " & Converter.data.Item(FileExtension3)) Else Debug.WriteLine(FileExtension3 & " -> File Content Not Found") End If输出:
.mp4 -> 视频/mp4
.html -> 文本/html
.Random -> 找不到文件内容

