Невозможно получить правильный тип MIME файла .flv - PullRequest
1 голос
/ 16 декабря 2010

Я хочу получить MIME-файл локального файла .flv с помощью этой функции из проекта кода. http://www.codeproject.com/KB/dotnet/ContentType.aspx

Public Function GetMIMEType(_
    ByVal filepath As String) As String 
 Dim regPerm  As RegistryPermission = _
       New RegistryPermission(RegistryPermissionAccess.Read, _
       "\\HKEY_CLASSES_ROOT")
 Dim classesRoot As RegistryKey = Registry.ClassesRoot
 Dim fi = New FileInfo(filepath)
 Dim dotExt As String = LCase(fi.Extension)
 Dim typeKey As RegistryKey = classesRoot.OpenSubKey(_
      "MIME\Database\Content Type")
 Dim keyname As String 

For Each keyname In typeKey.GetSubKeyNames()
 Dim curKey As RegistryKey = classesRoot.OpenSubKey( _
      "MIME\Database\Content Type\" & keyname)
 If LCase(curKey.GetValue("Extension")) = dotExt Then
    'Debug.WriteLine("Content type was " & keyname)
     Return keyname
 End If
Next 
End Function  

Но он возвращает тип MIME для файла .flv как x-x509-ca-cert

1 Ответ

4 голосов
/ 17 декабря 2010

Ваш подход имеет несколько недостатков:

  • приложения должны быть установлены для обнаружения mime-типа
  • некоторые типы MIME (например, htm и html) имеют несколько расширений, но вбольшинство из них можно найти в реестре
  • само расширение ничего не говорит о реальном содержимом файла (вы можете изменить его вручную).

Попробуйте следующий класс, чтобы получить типы пантомимы,Они будут идентифицированы по комбинации прослушивания первых 256 байт файла (urlmon.dll - например, используется Internet Explorer) и набора известных типов.

Imports System.Runtime.InteropServices
Imports System.IO

Public Class GetMimeType
    'Test-Function'
    Private Sub BtnGetMymeType_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnGetMymeType.Click
        Dim fileSelector As New System.Windows.Forms.OpenFileDialog
        If fileSelector.ShowDialog = Windows.Forms.DialogResult.OK Then
           MessageBox.Show(MimeTypes.GetContentType(fileSelector.FileName))
        End If
    End Sub
End Class

Public Class MimeTypes
    Private Shared knownTypes As List(Of String)
    Private Shared mimeTypes As Dictionary(Of String, String)

    <DllImport("urlmon.dll", CharSet:=CharSet.Auto)> _
    Private Shared Function FindMimeFromData(ByVal pBC As UInt32, <MarshalAs(UnmanagedType.LPStr)> ByVal pwzUrl As String, <MarshalAs(UnmanagedType.LPArray)> ByVal pBuffer As Byte(), ByVal cbSize As UInt32, <MarshalAs(UnmanagedType.LPStr)> ByVal pwzMimeProposed As String, ByVal dwMimeFlags As UInt32, ByRef ppwzMimeOut As UInt32, ByVal dwReserverd As UInt32) As UInt32
    End Function

    Public Shared Function GetContentType(ByVal fileName As String) As String
        If knownTypes Is Nothing OrElse mimeTypes Is Nothing Then InitializeMimeTypeLists()
        Dim contentType As String = ""
        Dim extension As String = IO.Path.GetExtension(fileName).Replace(".", "").ToLower
        mimeTypes.TryGetValue(extension, contentType)
        If String.IsNullOrEmpty(contentType) OrElse knownTypes.Contains(contentType) Then
            Dim headerType As String = ScanFileForMimeType(fileName)
            If headerType <> "application/octet-stream" OrElse String.IsNullOrEmpty(contentType) Then contentType = headerType
        End If
        Return contentType
    End Function

    Private Shared Function ScanFileForMimeType(ByVal fileName As String) As String
        Try
            Dim buffer As Byte() = New Byte(255) {}
            Using fs As New FileStream(fileName, FileMode.Open)
               Dim readLength As Integer = CInt(Math.Min(256, fs.Length))
               fs.Read(buffer, 0, readLength)
            End Using

            Dim mimeType As UInt32
            FindMimeFromData(0, Nothing, buffer, 256, Nothing, 0, mimeType, 0)
            Dim mimeTypePtr As IntPtr = New IntPtr(mimeType)
            Dim mime As String = Marshal.PtrToStringUni(mimeTypePtr)
            Marshal.FreeCoTaskMem(mimeTypePtr)
            If String.IsNullOrEmpty(mime) Then mime = "application/octet-stream"
            Return mime
        Catch ex As Exception
            Return "application/octet-stream"
        End Try
    End Function

    Private Shared Sub InitializeMimeTypeLists()
        knownTypes = New String() {"text/plain", "text/html", "text/xml", "text/richtext", "text/scriptlet", _
                                   "audio/x-aiff", "audio/basic", "audio/mid", "audio/wav", _
                                   "image/gif", "image/jpeg", "image/pjpeg", "image/png", "image/x-png", "image/tiff", "image/bmp", _
                                   "image/x-xbitmap", "image/x-jg", "image/x-emf", "image/x-wmf", "video/avi", "video/mpeg", _
                                   "application/octet-stream", "application/postscript", "application/base64", "application/macbinhex40", _
                                   "application/pdf", "application/xml", "application/atom+xml", "application/rss+xml", _
                                   "application/x-compressed", "application/x-zip-compressed", "application/x-gzip-compressed", _
                                   "application/java", "application/x-msdownload" _
                                   }.ToList
        mimeTypes = New Dictionary(Of String, String)
        With mimeTypes
            .Add("3dm", "x-world/x-3dmf")
            .Add("3dmf", "x-world/x-3dmf")
            .Add("a", "application/octet-stream")
            .Add("aab", "application/x-authorware-bin")
            .Add("aam", "application/x-authorware-map")
            .Add("aas", "application/x-authorware-seg")
            .Add("abc", "text/vnd.abc")
            .Add("acgi", "text/html")
            .Add("afl", "video/animaflex")
            .Add("ai", "application/postscript")
            .Add("aif", "audio/aiff")
            .Add("aifc", "audio/aiff")
            .Add("aiff", "audio/aiff")
            .Add("aim", "application/x-aim")
            .Add("aip", "text/x-audiosoft-intra")
            .Add("ani", "application/x-navi-animation")
            .Add("aos", "application/x-nokia-9000-communicator-add-on-software")
            .Add("aps", "application/mime")
            .Add("arc", "application/octet-stream")
            .Add("arj", "application/arj")
            .Add("art", "image/x-jg")
            .Add("asf", "video/x-ms-asf")
            .Add("asm", "text/x-asm")
            .Add("asp", "text/asp")
            .Add("asx", "application/x-mplayer2")
            .Add("au", "audio/basic")
            .Add("avi", "video/avi")
            .Add("avs", "video/avs-video")
            .Add("bcpio", "application/x-bcpio")
            .Add("bin", "application/octet-stream")
            .Add("bm", "image/bmp")
            .Add("bmp", "image/bmp")
            .Add("boo", "application/book")
            .Add("book", "application/book")
            .Add("boz", "application/x-bzip2")
            .Add("bsh", "application/x-bsh")
            .Add("bz", "application/x-bzip")
            .Add("bz2", "application/x-bzip2")
            .Add("c", "text/plain")
            .Add("c++", "text/plain")
            .Add("cat", "application/vnd.ms-pki.seccat")
            .Add("cc", "text/plain")
            .Add("ccad", "application/clariscad")
            .Add("cco", "application/x-cocoa")
            .Add("cdf", "application/cdf")
            .Add("cer", "application/pkix-cert")
            .Add("cha", "application/x-chat")
            .Add("chat", "application/x-chat")
            .Add("class", "application/java")
            .Add("com", "application/octet-stream")
            .Add("conf", "text/plain")
            .Add("cpio", "application/x-cpio")
            .Add("cpp", "text/x-c")
            .Add("cpt", "application/x-cpt")
            .Add("crl", "application/pkcs-crl")
            .Add("css", "text/css")
            .Add("def", "text/plain")
            .Add("der", "application/x-x509-ca-cert")
            .Add("dif", "video/x-dv")
            .Add("dir", "application/x-director")
            .Add("dl", "video/dl")
            .Add("doc", "application/msword")
            .Add("dot", "application/msword")
            .Add("dp", "application/commonground")
            .Add("drw", "application/drafting")
            .Add("dump", "application/octet-stream")
            .Add("dv", "video/x-dv")
            .Add("dvi", "application/x-dvi")
            .Add("dwf", "drawing/x-dwf (old)")
            .Add("dwg", "application/acad")
            .Add("dxf", "application/dxf")
            .Add("eps", "application/postscript")
            .Add("es", "application/x-esrehber")
            .Add("etx", "text/x-setext")
            .Add("evy", "application/envoy")
            .Add("exe", "application/octet-stream")
            .Add("f", "text/plain")
            .Add("f90", "text/x-fortran")
            .Add("fdf", "application/vnd.fdf")
            .Add("fif", "image/fif")
            .Add("fli", "video/fli")
            .Add("flv", "video/x-flv")
            .Add("for", "text/x-fortran")
            .Add("fpx", "image/vnd.fpx")
            .Add("g", "text/plain")
            .Add("g3", "image/g3fax")
            .Add("gif", "image/gif")
            .Add("gl", "video/gl")
            .Add("gsd", "audio/x-gsm")
            .Add("gtar", "application/x-gtar")
            .Add("gz", "application/x-compressed")
            .Add("h", "text/plain")
            .Add("help", "application/x-helpfile")
            .Add("hgl", "application/vnd.hp-hpgl")
            .Add("hh", "text/plain")
            .Add("hlp", "application/x-winhelp")
            .Add("htc", "text/x-component")
            .Add("htm", "text/html")
            .Add("html", "text/html")
            .Add("htmls", "text/html")
            .Add("htt", "text/webviewhtml")
            .Add("htx", "text/html")
            .Add("ice", "x-conference/x-cooltalk")
            .Add("ico", "image/x-icon")
            .Add("idc", "text/plain")
            .Add("ief", "image/ief")
            .Add("iefs", "image/ief")
            .Add("iges", "application/iges")
            .Add("igs", "application/iges")
            .Add("ima", "application/x-ima")
            .Add("imap", "application/x-httpd-imap")
            .Add("inf", "application/inf")
            .Add("ins", "application/x-internett-signup")
            .Add("ip", "application/x-ip2")
            .Add("isu", "video/x-isvideo")
            .Add("it", "audio/it")
            .Add("iv", "application/x-inventor")
            .Add("ivr", "i-world/i-vrml")
            .Add("ivy", "application/x-livescreen")
            .Add("jam", "audio/x-jam")
            .Add("jav", "text/plain")
            .Add("java", "text/plain")
            .Add("jcm", "application/x-java-commerce")
            .Add("jfif", "image/jpeg")
            .Add("jfif-tbnl", "image/jpeg")
            .Add("jpe", "image/jpeg")
            .Add("jpeg", "image/jpeg")
            .Add("jpg", "image/jpeg")
            .Add("jps", "image/x-jps")
            .Add("js", "application/x-javascript")
            .Add("jut", "image/jutvision")
            .Add("kar", "audio/midi")
            .Add("ksh", "application/x-ksh")
            .Add("la", "audio/nspaudio")
            .Add("lam", "audio/x-liveaudio")
            .Add("latex", "application/x-latex")
            .Add("lha", "application/lha")
            .Add("lhx", "application/octet-stream")
            .Add("list", "text/plain")
            .Add("lma", "audio/nspaudio")
            .Add("log", "text/plain")
            .Add("lsp", "application/x-lisp")
            .Add("lst", "text/plain")
            .Add("lsx", "text/x-la-asf")
            .Add("ltx", "application/x-latex")
            .Add("lzh", "application/octet-stream")
            .Add("lzx", "application/lzx")
            .Add("m", "text/plain")
            .Add("m1v", "video/mpeg")
            .Add("m2a", "audio/mpeg")
            .Add("m2v", "video/mpeg")
            .Add("m3u", "audio/x-mpequrl")
            .Add("man", "application/x-troff-man")
            .Add("map", "application/x-navimap")
            .Add("mar", "text/plain")
            .Add("mbd", "application/mbedlet")
            .Add("mc$", "application/x-magic-cap-package-1.0")
            .Add("mcd", "application/mcad")
            .Add("mcf", "image/vasa")
            .Add("mcp", "application/netmc")
            .Add("me", "application/x-troff-me")
            .Add("mht", "message/rfc822")
            .Add("mhtml", "message/rfc822")
            .Add("mid", "audio/midi")
            .Add("midi", "audio/midi")
            .Add("mif", "application/x-frame")
            .Add("mime", "message/rfc822")
            .Add("mjf", "audio/x-vnd.audioexplosion.mjuicemediafile")
            .Add("mjpg", "video/x-motion-jpeg")
            .Add("mm", "application/base64")
            .Add("mme", "application/base64")
            .Add("mod", "audio/mod")
            .Add("moov", "video/quicktime")
            .Add("mov", "video/quicktime")
            .Add("movie", "video/x-sgi-movie")
            .Add("mp2", "audio/mpeg")
            .Add("mp3", "audio/mpeg3")
            .Add("mpa", "audio/mpeg")
            .Add("mpc", "application/x-project")
            .Add("mpe", "video/mpeg")
            .Add("mpeg", "video/mpeg")
            .Add("mpg", "video/mpeg")
            .Add("mpga", "audio/mpeg")
            .Add("mpp", "application/vnd.ms-project")
            .Add("mpt", "application/x-project")
            .Add("mpv", "application/x-project")
            .Add("mpx", "application/x-project")
            .Add("mrc", "application/marc")
            .Add("ms", "application/x-troff-ms")
            .Add("mv", "video/x-sgi-movie")
            .Add("my", "audio/make")
            .Add("mzz", "application/x-vnd.audioexplosion.mzz")
            .Add("nap", "image/naplps")
            .Add("naplps", "image/naplps")
            .Add("nc", "application/x-netcdf")
            .Add("ncm", "application/vnd.nokia.configuration-message")
            .Add("nif", "image/x-niff")
            .Add("niff", "image/x-niff")
            .Add("nix", "application/x-mix-transfer")
            .Add("nsc", "application/x-conference")
            .Add("nvd", "application/x-navidoc")
            .Add("o", "application/octet-stream")
            .Add("oda", "application/oda")
            .Add("omc", "application/x-omc")
            .Add("omcd", "application/x-omcdatamaker")
            .Add("omcr", "application/x-omcregerator")
            .Add("p", "text/x-pascal")
            .Add("p10", "application/pkcs10")
            .Add("p12", "application/pkcs-12")
            .Add("p7a", "application/x-pkcs7-signature")
            .Add("p7c", "application/pkcs7-mime")
            .Add("pas", "text/pascal")
            .Add("pbm", "image/x-portable-bitmap")
            .Add("pcl", "application/vnd.hp-pcl")
            .Add("pct", "image/x-pict")
            .Add("pcx", "image/x-pcx")
            .Add("pdf", "application/pdf")
            .Add("pfunk", "audio/make")
            .Add("pgm", "image/x-portable-graymap")
            .Add("pic", "image/pict")
            .Add("pict", "image/pict")
            .Add("pkg", "application/x-newton-compatible-pkg")
            .Add("pko", "application/vnd.ms-pki.pko")
            .Add("pl", "text/plain")
            .Add("plx", "application/x-pixclscript")
            .Add("pm", "image/x-xpixmap")
            .Add("png", "image/png")
            .Add("pnm", "application/x-portable-anymap")
            .Add("pot", "application/mspowerpoint")
            .Add("pov", "model/x-pov")
            .Add("ppa", "application/vnd.ms-powerpoint")
            .Add("ppm", "image/x-portable-pixmap")
            .Add("pps", "application/mspowerpoint")
            .Add("ppt", "application/mspowerpoint")
            .Add("ppz", "application/mspowerpoint")
            .Add("pre", "application/x-freelance")
            .Add("prt", "application/pro_eng")
            .Add("ps", "application/postscript")
            .Add("psd", "application/octet-stream")
            .Add("pvu", "paleovu/x-pv")
            .Add("pwz", "application/vnd.ms-powerpoint")
            .Add("py", "text/x-script.phyton")
            .Add("pyc", "applicaiton/x-bytecode.python")
            .Add("qcp", "audio/vnd.qcelp")
            .Add("qd3", "x-world/x-3dmf")
            .Add("qd3d", "x-world/x-3dmf")
            .Add("qif", "image/x-quicktime")
            .Add("qt", "video/quicktime")
            .Add("qtc", "video/x-qtc")
            .Add("qti", "image/x-quicktime")
            .Add("qtif", "image/x-quicktime")
            .Add("ra", "audio/x-pn-realaudio")
            .Add("ram", "audio/x-pn-realaudio")
            .Add("ras", "application/x-cmu-raster")
            .Add("rast", "image/cmu-raster")
            .Add("rexx", "text/x-script.rexx")
            .Add("rf", "image/vnd.rn-realflash")
            .Add("rgb", "image/x-rgb")
            .Add("rm", "application/vnd.rn-realmedia")
            .Add("rmi", "audio/mid")
            .Add("rmm", "audio/x-pn-realaudio")
            .Add("rmp", "audio/x-pn-realaudio")
            .Add("rng", "application/ringing-tones")
            .Add("rnx", "application/vnd.rn-realplayer")
            .Add("roff", "application/x-troff")
            .Add("rp", "image/vnd.rn-realpix")
            .Add("rpm", "audio/x-pn-realaudio-plugin")
            .Add("rt", "text/richtext")
            .Add("rtf", "text/richtext")
            .Add("rtx", "application/rtf")
            .Add("rv", "video/vnd.rn-realvideo")
            .Add("s", "text/x-asm")
            .Add("s3m", "audio/s3m")
            .Add("saveme", "application/octet-stream")
            .Add("sbk", "application/x-tbook")
            .Add("scm", "application/x-lotusscreencam")
            .Add("sdml", "text/plain")
            .Add("sdp", "application/sdp")
            .Add("sdr", "application/sounder")
            .Add("sea", "application/sea")
            .Add("set", "application/set")
            .Add("sgm", "text/sgml")
            .Add("sgml", "text/sgml")
            .Add("sh", "application/x-bsh")
            .Add("shtml", "text/html")
            .Add("sid", "audio/x-psid")
            .Add("sit", "application/x-sit")
            .Add("skd", "application/x-koan")
            .Add("skm", "application/x-koan")
            .Add("skp", "application/x-koan")
            .Add("skt", "application/x-koan")
            .Add("sl", "application/x-seelogo")
            .Add("smi", "application/smil")
            .Add("smil", "application/smil")
            .Add("snd", "audio/basic")
            .Add("sol", "application/solids")
            .Add("spc", "application/x-pkcs7-certificates")
            .Add("spl", "application/futuresplash")
            .Add("spr", "application/x-sprite")
            .Add("sprite", "application/x-sprite")
            .Add("src", "application/x-wais-source")
            .Add("ssi", "text/x-server-parsed-html")
            .Add("ssm", "application/streamingmedia")
            .Add("sst", "application/vnd.ms-pki.certstore")
            .Add("step", "application/step")
            .Add("stl", "application/sla")
            .Add("stp", "application/step")
            .Add("sv4cpio", "application/x-sv4cpio")
            .Add("sv4crc", "application/x-sv4crc")
            .Add("svf", "image/vnd.dwg")
            .Add("svr", "application/x-world")
            .Add("swf", "application/x-shockwave-flash")
            .Add("t", "application/x-troff")
            .Add("talk", "text/x-speech")
            .Add("tar", "application/x-tar")
            .Add("tbk", "application/toolbook")
            .Add("tcl", "application/x-tcl")
            .Add("tcsh", "text/x-script.tcsh")
            .Add("tex", "application/x-tex")
            .Add("texi", "application/x-texinfo")
            .Add("texinfo", "application/x-texinfo")
            .Add("text", "text/plain")
            .Add("tgz", "application/x-compressed")
            .Add("tif", "image/tiff")
            .Add("tr", "application/x-troff")
            .Add("tsi", "audio/tsp-audio")
            .Add("tsp", "audio/tsplayer")
            .Add("tsv", "text/tab-separated-values")
            .Add("turbot", "image/florian")
            .Add("txt", "text/plain")
            .Add("uil", "text/x-uil")
            .Add("uni", "text/uri-list")
            .Add("unis", "text/uri-list")
            .Add("unv", "application/i-deas")
            .Add("uri", "text/uri-list")
            .Add("uris", "text/uri-list")
            .Add("ustar", "application/x-ustar")
            .Add("uu", "application/octet-stream")
            .Add("vcd", "application/x-cdlink")
            .Add("vcs", "text/x-vcalendar")
            .Add("vda", "application/vda")
            .Add("vdo", "video/vdo")
            .Add("vew", "application/groupwise")
            .Add("viv", "video/vivo")
            .Add("vivo", "video/vivo")
            .Add("vmd", "application/vocaltec-media-desc")
            .Add("vmf", "application/vocaltec-media-file")
            .Add("voc", "audio/voc")
            .Add("vos", "video/vosaic")
            .Add("vox", "audio/voxware")
            .Add("vqe", "audio/x-twinvq-plugin")
            .Add("vqf", "audio/x-twinvq")
            .Add("vql", "audio/x-twinvq-plugin")
            .Add("vrml", "application/x-vrml")
            .Add("vrt", "x-world/x-vrt")
            .Add("vsd", "application/x-visio")
            .Add("vst", "application/x-visio")
            .Add("vsw", "application/x-visio")
            .Add("w60", "application/wordperfect6.0")
            .Add("w61", "application/wordperfect6.1")
            .Add("w6w", "application/msword")
            .Add("wav", "audio/wav")
            .Add("wb1", "application/x-qpro")
            .Add("wbmp", "image/vnd.wap.wbmp")
            .Add("web", "application/vnd.xara")
            .Add("wiz", "application/msword")
            .Add("wk1", "application/x-123")
            .Add("wmf", "windows/metafile")
            .Add("wml", "text/vnd.wap.wml")
            .Add("wmlc", "application/vnd.wap.wmlc")
            .Add("wmls", "text/vnd.wap.wmlscript")
            .Add("wmlsc", "application/vnd.wap.wmlscriptc")
            .Add("word", "application/msword")
            .Add("wp", "application/wordperfect")
            .Add("wp5", "application/wordperfect")
            .Add("wp6", "application/wordperfect")
            .Add("wpd", "application/wordperfect")
            .Add("wq1", "application/x-lotus")
            .Add("wri", "application/mswrite")
            .Add("wrl", "application/x-world")
            .Add("wrz", "model/vrml")
            .Add("wsc", "text/scriplet")
            .Add("wsrc", "application/x-wais-source")
            .Add("wtk", "application/x-wintalk")
            .Add("xbm", "image/x-xbitmap")
            .Add("xdr", "video/x-amt-demorun")
            .Add("xgz", "xgl/drawing")
            .Add("xif", "image/vnd.xiff")
            .Add("xl", "application/excel")
            .Add("xla", "application/excel")
            .Add("xlb", "application/excel")
            .Add("xlc", "application/excel")
            .Add("xld", "application/excel")
            .Add("xlk", "application/excel")
            .Add("xll", "application/excel")
            .Add("xlm", "application/excel")
            .Add("xls", "application/excel")
            .Add("xlt", "application/excel")
            .Add("xlv", "application/excel")
            .Add("xlw", "application/excel")
            .Add("xm", "audio/xm")
            .Add("xml", "text/xml")
            .Add("xmz", "xgl/movie")
            .Add("xpix", "application/x-vnd.ls-xpix")
            .Add("xpm", "image/x-xpixmap")
            .Add("x-png", "image/png")
            .Add("xsr", "video/x-amt-showrun")
            .Add("xwd", "image/x-xwd")
            .Add("xyz", "chemical/x-pdb")
            .Add("z", "application/x-compress")
            .Add("zip", "application/x-compressed")
            .Add("zoo", "application/octet-stream")
            .Add("zsh", "text/x-script.zsh")
        End With
    End Sub
End Class

Вы должны обновить этот список, когда тип MIME неизвестен и недостаточно знать, что это application / octet-stream.Может быть достаточно проверить, является ли расширение txt, но mime-тип - это двоичные данные, потому что это означает, что этот файл не тот, каким он притворяется.

...