如何在 .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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-03 12:25:12  来源:igfitidea点击:

How do I determine a file's content type in .NET?

.netfilefile-iocontent-typemime-types

提问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

回答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

假设下载它的人将使用网络浏览器,请尝试使用常见的浏览器:IE 已知MIME 类型

回答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:

如何使用它:

  1. Add a string resource to you project that contains the list. It will look like this - enter image description here
  2. 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 Class
    
  3. Now 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 If
    

    Output:

    .mp4 -> video/mp4

    .html -> text/html

    .Random -> File Content Not Found

  1. 向包含列表的项目添加字符串资源。它看起来像这样 -在此处输入图片说明
  2. 将此类添加到您的项目中(将字符串解析为字典)

    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
    
  3. 现在你可以像这样使用它:

    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 -> 找不到文件内容