code_junkie

Using .NET, how can you find the mime type of a file based on the file signature not the extension

Nov 10th, 2011
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.47 KB | None | 0 0
  1. using System.Runtime.InteropServices;
  2.  
  3. [DllImport(@"urlmon.dll", CharSet = CharSet.Auto)]
  4. private extern static System.UInt32 FindMimeFromData(
  5. System.UInt32 pBC,
  6. [MarshalAs(UnmanagedType.LPStr)] System.String pwzUrl,
  7. [MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer,
  8. System.UInt32 cbSize,
  9. [MarshalAs(UnmanagedType.LPStr)] System.String pwzMimeProposed,
  10. System.UInt32 dwMimeFlags,
  11. out System.UInt32 ppwzMimeOut,
  12. System.UInt32 dwReserverd
  13. );
  14.  
  15. public string getMimeFromFile(string filename)
  16. {
  17. if (!File.Exists(filename))
  18. throw new FileNotFoundException(filename + " not found");
  19.  
  20. byte[] buffer = new byte[256];
  21. using (FileStream fs = new FileStream(filename, FileMode.Open))
  22. {
  23. if (fs.Length >= 256)
  24. fs.Read(buffer, 0, 256);
  25. else
  26. fs.Read(buffer, 0, (int)fs.Length);
  27. }
  28. try
  29. {
  30. System.UInt32 mimetype;
  31. FindMimeFromData(0, null, buffer, 256, null, 0, out mimetype, 0);
  32. System.IntPtr mimeTypePtr = new IntPtr(mimetype);
  33. string mime = Marshal.PtrToStringUni(mimeTypePtr);
  34. Marshal.FreeCoTaskMem(mimeTypePtr);
  35. return mime;
  36. }
  37. catch (Exception e)
  38. {
  39. return "unknown/unknown";
  40. }
  41. }
  42.  
  43. using System.IO;
  44. using Microsoft.Win32;
  45.  
  46. string GetMimeType(FileInfo fileInfo)
  47. {
  48. string mimeType = "application/unknown";
  49.  
  50. RegistryKey regKey = Registry.ClassesRoot.OpenSubKey(
  51. fileInfo.Extension.ToLower()
  52. );
  53.  
  54. if(regKey != null)
  55. {
  56. object contentType = regKey.GetValue("Content Type");
  57.  
  58. if(contentType != null)
  59. mimeType = contentType.ToString();
  60. }
  61.  
  62. return mimeType;
  63. }
  64.  
  65. public static class MIMEAssistant
  66. {
  67. private static readonly Dictionary<string, string> MIMETypesDictionary = new Dictionary<string, string>
  68. {
  69. {"ai", "application/postscript"},
  70. {"aif", "audio/x-aiff"},
  71. {"aifc", "audio/x-aiff"},
  72. {"aiff", "audio/x-aiff"},
  73. {"asc", "text/plain"},
  74. {"atom", "application/atom+xml"},
  75. {"au", "audio/basic"},
  76. {"avi", "video/x-msvideo"},
  77. {"bcpio", "application/x-bcpio"},
  78. {"bin", "application/octet-stream"},
  79. {"bmp", "image/bmp"},
  80. {"cdf", "application/x-netcdf"},
  81. {"cgm", "image/cgm"},
  82. {"class", "application/octet-stream"},
  83. {"cpio", "application/x-cpio"},
  84. {"cpt", "application/mac-compactpro"},
  85. {"csh", "application/x-csh"},
  86. {"css", "text/css"},
  87. {"dcr", "application/x-director"},
  88. {"dif", "video/x-dv"},
  89. {"dir", "application/x-director"},
  90. {"djv", "image/vnd.djvu"},
  91. {"djvu", "image/vnd.djvu"},
  92. {"dll", "application/octet-stream"},
  93. {"dmg", "application/octet-stream"},
  94. {"dms", "application/octet-stream"},
  95. {"doc", "application/msword"},
  96. {"dtd", "application/xml-dtd"},
  97. {"dv", "video/x-dv"},
  98. {"dvi", "application/x-dvi"},
  99. {"dxr", "application/x-director"},
  100. {"eps", "application/postscript"},
  101. {"etx", "text/x-setext"},
  102. {"exe", "application/octet-stream"},
  103. {"ez", "application/andrew-inset"},
  104. {"gif", "image/gif"},
  105. {"gram", "application/srgs"},
  106. {"grxml", "application/srgs+xml"},
  107. {"gtar", "application/x-gtar"},
  108. {"hdf", "application/x-hdf"},
  109. {"hqx", "application/mac-binhex40"},
  110. {"htm", "text/html"},
  111. {"html", "text/html"},
  112. {"ice", "x-conference/x-cooltalk"},
  113. {"ico", "image/x-icon"},
  114. {"ics", "text/calendar"},
  115. {"ief", "image/ief"},
  116. {"ifb", "text/calendar"},
  117. {"iges", "model/iges"},
  118. {"igs", "model/iges"},
  119. {"jnlp", "application/x-java-jnlp-file"},
  120. {"jp2", "image/jp2"},
  121. {"jpe", "image/jpeg"},
  122. {"jpeg", "image/jpeg"},
  123. {"jpg", "image/jpeg"},
  124. {"js", "application/x-javascript"},
  125. {"kar", "audio/midi"},
  126. {"latex", "application/x-latex"},
  127. {"lha", "application/octet-stream"},
  128. {"lzh", "application/octet-stream"},
  129. {"m3u", "audio/x-mpegurl"},
  130. {"m4a", "audio/mp4a-latm"},
  131. {"m4b", "audio/mp4a-latm"},
  132. {"m4p", "audio/mp4a-latm"},
  133. {"m4u", "video/vnd.mpegurl"},
  134. {"m4v", "video/x-m4v"},
  135. {"mac", "image/x-macpaint"},
  136. {"man", "application/x-troff-man"},
  137. {"mathml", "application/mathml+xml"},
  138. {"me", "application/x-troff-me"},
  139. {"mesh", "model/mesh"},
  140. {"mid", "audio/midi"},
  141. {"midi", "audio/midi"},
  142. {"mif", "application/vnd.mif"},
  143. {"mov", "video/quicktime"},
  144. {"movie", "video/x-sgi-movie"},
  145. {"mp2", "audio/mpeg"},
  146. {"mp3", "audio/mpeg"},
  147. {"mp4", "video/mp4"},
  148. {"mpe", "video/mpeg"},
  149. {"mpeg", "video/mpeg"},
  150. {"mpg", "video/mpeg"},
  151. {"mpga", "audio/mpeg"},
  152. {"ms", "application/x-troff-ms"},
  153. {"msh", "model/mesh"},
  154. {"mxu", "video/vnd.mpegurl"},
  155. {"nc", "application/x-netcdf"},
  156. {"oda", "application/oda"},
  157. {"ogg", "application/ogg"},
  158. {"pbm", "image/x-portable-bitmap"},
  159. {"pct", "image/pict"},
  160. {"pdb", "chemical/x-pdb"},
  161. {"pdf", "application/pdf"},
  162. {"pgm", "image/x-portable-graymap"},
  163. {"pgn", "application/x-chess-pgn"},
  164. {"pic", "image/pict"},
  165. {"pict", "image/pict"},
  166. {"png", "image/png"},
  167. {"pnm", "image/x-portable-anymap"},
  168. {"pnt", "image/x-macpaint"},
  169. {"pntg", "image/x-macpaint"},
  170. {"ppm", "image/x-portable-pixmap"},
  171. {"ppt", "application/vnd.ms-powerpoint"},
  172. {"ps", "application/postscript"},
  173. {"qt", "video/quicktime"},
  174. {"qti", "image/x-quicktime"},
  175. {"qtif", "image/x-quicktime"},
  176. {"ra", "audio/x-pn-realaudio"},
  177. {"ram", "audio/x-pn-realaudio"},
  178. {"ras", "image/x-cmu-raster"},
  179. {"rdf", "application/rdf+xml"},
  180. {"rgb", "image/x-rgb"},
  181. {"rm", "application/vnd.rn-realmedia"},
  182. {"roff", "application/x-troff"},
  183. {"rtf", "text/rtf"},
  184. {"rtx", "text/richtext"},
  185. {"sgm", "text/sgml"},
  186. {"sgml", "text/sgml"},
  187. {"sh", "application/x-sh"},
  188. {"shar", "application/x-shar"},
  189. {"silo", "model/mesh"},
  190. {"sit", "application/x-stuffit"},
  191. {"skd", "application/x-koan"},
  192. {"skm", "application/x-koan"},
  193. {"skp", "application/x-koan"},
  194. {"skt", "application/x-koan"},
  195. {"smi", "application/smil"},
  196. {"smil", "application/smil"},
  197. {"snd", "audio/basic"},
  198. {"so", "application/octet-stream"},
  199. {"spl", "application/x-futuresplash"},
  200. {"src", "application/x-wais-source"},
  201. {"sv4cpio", "application/x-sv4cpio"},
  202. {"sv4crc", "application/x-sv4crc"},
  203. {"svg", "image/svg+xml"},
  204. {"swf", "application/x-shockwave-flash"},
  205. {"t", "application/x-troff"},
  206. {"tar", "application/x-tar"},
  207. {"tcl", "application/x-tcl"},
  208. {"tex", "application/x-tex"},
  209. {"texi", "application/x-texinfo"},
  210. {"texinfo", "application/x-texinfo"},
  211. {"tif", "image/tiff"},
  212. {"tiff", "image/tiff"},
  213. {"tr", "application/x-troff"},
  214. {"tsv", "text/tab-separated-values"},
  215. {"txt", "text/plain"},
  216. {"ustar", "application/x-ustar"},
  217. {"vcd", "application/x-cdlink"},
  218. {"vrml", "model/vrml"},
  219. {"vxml", "application/voicexml+xml"},
  220. {"wav", "audio/x-wav"},
  221. {"wbmp", "image/vnd.wap.wbmp"},
  222. {"wbmxl", "application/vnd.wap.wbxml"},
  223. {"wml", "text/vnd.wap.wml"},
  224. {"wmlc", "application/vnd.wap.wmlc"},
  225. {"wmls", "text/vnd.wap.wmlscript"},
  226. {"wmlsc", "application/vnd.wap.wmlscriptc"},
  227. {"wrl", "model/vrml"},
  228. {"xbm", "image/x-xbitmap"},
  229. {"xht", "application/xhtml+xml"},
  230. {"xhtml", "application/xhtml+xml"},
  231. {"xls", "application/vnd.ms-excel"},
  232. {"xml", "application/xml"},
  233. {"xpm", "image/x-xpixmap"},
  234. {"xsl", "application/xml"},
  235. {"xslt", "application/xslt+xml"},
  236. {"xul", "application/vnd.mozilla.xul+xml"},
  237. {"xwd", "image/x-xwindowdump"},
  238. {"xyz", "chemical/x-xyz"},
  239. {"zip", "application/zip"}
  240. };
  241.  
  242. public static string GetMIMEType(string fileName)
  243. {
  244. if (MIMETypesDictionary.ContainsKey(Path.GetExtension(fileName).Remove(0, 1)))
  245. {
  246. return MIMETypesDictionary[Path.GetExtension(fileName).Remove(0, 1)];
  247. }
  248. return "unknown/unknown";
  249. }
  250. }
  251.  
  252. Public Shared Function GetFromFileName(ByVal fileName As String) As String
  253. Return GetFromExtension(Path.GetExtension(fileName).Remove(0, 1))
  254. End Function
  255.  
  256. Public Shared Function GetFromExtension(ByVal extension As String) As String
  257. If extension.StartsWith("."c) Then
  258. extension = extension.Remove(0, 1)
  259. End If
  260.  
  261. If MIMETypesDictionary.ContainsKey(extension) Then
  262. Return MIMETypesDictionary(extension)
  263. End If
  264.  
  265. Return "unknown/unknown"
  266. End Function
  267.  
  268. Private Shared ReadOnly MIMETypesDictionary As New Dictionary(Of String, String)() From { _
  269. {"ai", "application/postscript"}, _
  270. {"aif", "audio/x-aiff"}, _
  271. {"aifc", "audio/x-aiff"}, _
  272. {"aiff", "audio/x-aiff"}, _
  273. {"asc", "text/plain"}, _
  274. {"atom", "application/atom+xml"}, _
  275. {"au", "audio/basic"}, _
  276. {"avi", "video/x-msvideo"}, _
  277. {"bcpio", "application/x-bcpio"}, _
  278. {"bin", "application/octet-stream"}, _
  279. {"bmp", "image/bmp"}, _
  280. {"cdf", "application/x-netcdf"}, _
  281. {"cgm", "image/cgm"}, _
  282. {"class", "application/octet-stream"}, _
  283. {"cpio", "application/x-cpio"}, _
  284. {"cpt", "application/mac-compactpro"}, _
  285. {"csh", "application/x-csh"}, _
  286. {"css", "text/css"}, _
  287. {"dcr", "application/x-director"}, _
  288. {"dif", "video/x-dv"}, _
  289. {"dir", "application/x-director"}, _
  290. {"djv", "image/vnd.djvu"}, _
  291. {"djvu", "image/vnd.djvu"}, _
  292. {"dll", "application/octet-stream"}, _
  293. {"dmg", "application/octet-stream"}, _
  294. {"dms", "application/octet-stream"}, _
  295. {"doc", "application/msword"}, _
  296. {"dtd", "application/xml-dtd"}, _
  297. {"dv", "video/x-dv"}, _
  298. {"dvi", "application/x-dvi"}, _
  299. {"dxr", "application/x-director"}, _
  300. {"eps", "application/postscript"}, _
  301. {"etx", "text/x-setext"}, _
  302. {"exe", "application/octet-stream"}, _
  303. {"ez", "application/andrew-inset"}, _
  304. {"gif", "image/gif"}, _
  305. {"gram", "application/srgs"}, _
  306. {"grxml", "application/srgs+xml"}, _
  307. {"gtar", "application/x-gtar"}, _
  308. {"hdf", "application/x-hdf"}, _
  309. {"hqx", "application/mac-binhex40"}, _
  310. {"htm", "text/html"}, _
  311. {"html", "text/html"}, _
  312. {"ice", "x-conference/x-cooltalk"}, _
  313. {"ico", "image/x-icon"}, _
  314. {"ics", "text/calendar"}, _
  315. {"ief", "image/ief"}, _
  316. {"ifb", "text/calendar"}, _
  317. {"iges", "model/iges"}, _
  318. {"igs", "model/iges"}, _
  319. {"jnlp", "application/x-java-jnlp-file"}, _
  320. {"jp2", "image/jp2"}, _
  321. {"jpe", "image/jpeg"}, _
  322. {"jpeg", "image/jpeg"}, _
  323. {"jpg", "image/jpeg"}, _
  324. {"js", "application/x-javascript"}, _
  325. {"kar", "audio/midi"}, _
  326. {"latex", "application/x-latex"}, _
  327. {"lha", "application/octet-stream"}, _
  328. {"lzh", "application/octet-stream"}, _
  329. {"m3u", "audio/x-mpegurl"}, _
  330. {"m4a", "audio/mp4a-latm"}, _
  331. {"m4b", "audio/mp4a-latm"}, _
  332. {"m4p", "audio/mp4a-latm"}, _
  333. {"m4u", "video/vnd.mpegurl"}, _
  334. {"m4v", "video/x-m4v"}, _
  335. {"mac", "image/x-macpaint"}, _
  336. {"man", "application/x-troff-man"}, _
  337. {"mathml", "application/mathml+xml"}, _
  338. {"me", "application/x-troff-me"}, _
  339. {"mesh", "model/mesh"}, _
  340. {"mid", "audio/midi"}, _
  341. {"midi", "audio/midi"}, _
  342. {"mif", "application/vnd.mif"}, _
  343. {"mov", "video/quicktime"}, _
  344. {"movie", "video/x-sgi-movie"}, _
  345. {"mp2", "audio/mpeg"}, _
  346. {"mp3", "audio/mpeg"}, _
  347. {"mp4", "video/mp4"}, _
  348. {"mpe", "video/mpeg"}, _
  349. {"mpeg", "video/mpeg"}, _
  350. {"mpg", "video/mpeg"}, _
  351. {"mpga", "audio/mpeg"}, _
  352. {"ms", "application/x-troff-ms"}, _
  353. {"msh", "model/mesh"}, _
  354. {"mxu", "video/vnd.mpegurl"}, _
  355. {"nc", "application/x-netcdf"}, _
  356. {"oda", "application/oda"}, _
  357. {"ogg", "application/ogg"}, _
  358. {"pbm", "image/x-portable-bitmap"}, _
  359. {"pct", "image/pict"}, _
  360. {"pdb", "chemical/x-pdb"}, _
  361. {"pdf", "application/pdf"}, _
  362. {"pgm", "image/x-portable-graymap"}, _
  363. {"pgn", "application/x-chess-pgn"}, _
  364. {"pic", "image/pict"}, _
  365. {"pict", "image/pict"}, _
  366. {"png", "image/png"}, _
  367. {"pnm", "image/x-portable-anymap"}, _
  368. {"pnt", "image/x-macpaint"}, _
  369. {"pntg", "image/x-macpaint"}, _
  370. {"ppm", "image/x-portable-pixmap"}, _
  371. {"ppt", "application/vnd.ms-powerpoint"}, _
  372. {"ps", "application/postscript"}, _
  373. {"qt", "video/quicktime"}, _
  374. {"qti", "image/x-quicktime"}, _
  375. {"qtif", "image/x-quicktime"}, _
  376. {"ra", "audio/x-pn-realaudio"}, _
  377. {"ram", "audio/x-pn-realaudio"}, _
  378. {"ras", "image/x-cmu-raster"}, _
  379. {"rdf", "application/rdf+xml"}, _
  380. {"rgb", "image/x-rgb"}, _
  381. {"rm", "application/vnd.rn-realmedia"}, _
  382. {"roff", "application/x-troff"}, _
  383. {"rtf", "text/rtf"}, _
  384. {"rtx", "text/richtext"}, _
  385. {"sgm", "text/sgml"}, _
  386. {"sgml", "text/sgml"}, _
  387. {"sh", "application/x-sh"}, _
  388. {"shar", "application/x-shar"}, _
  389. {"silo", "model/mesh"}, _
  390. {"sit", "application/x-stuffit"}, _
  391. {"skd", "application/x-koan"}, _
  392. {"skm", "application/x-koan"}, _
  393. {"skp", "application/x-koan"}, _
  394. {"skt", "application/x-koan"}, _
  395. {"smi", "application/smil"}, _
  396. {"smil", "application/smil"}, _
  397. {"snd", "audio/basic"}, _
  398. {"so", "application/octet-stream"}, _
  399. {"spl", "application/x-futuresplash"}, _
  400. {"src", "application/x-wais-source"}, _
  401. {"sv4cpio", "application/x-sv4cpio"}, _
  402. {"sv4crc", "application/x-sv4crc"}, _
  403. {"svg", "image/svg+xml"}, _
  404. {"swf", "application/x-shockwave-flash"}, _
  405. {"t", "application/x-troff"}, _
  406. {"tar", "application/x-tar"}, _
  407. {"tcl", "application/x-tcl"}, _
  408. {"tex", "application/x-tex"}, _
  409. {"texi", "application/x-texinfo"}, _
  410. {"texinfo", "application/x-texinfo"}, _
  411. {"tif", "image/tiff"}, _
  412. {"tiff", "image/tiff"}, _
  413. {"tr", "application/x-troff"}, _
  414. {"tsv", "text/tab-separated-values"}, _
  415. {"txt", "text/plain"}, _
  416. {"ustar", "application/x-ustar"}, _
  417. {"vcd", "application/x-cdlink"}, _
  418. {"vrml", "model/vrml"}, _
  419. {"vxml", "application/voicexml+xml"}, _
  420. {"wav", "audio/x-wav"}, _
  421. {"wbmp", "image/vnd.wap.wbmp"}, _
  422. {"wbmxl", "application/vnd.wap.wbxml"}, _
  423. {"wml", "text/vnd.wap.wml"}, _
  424. {"wmlc", "application/vnd.wap.wmlc"}, _
  425. {"wmls", "text/vnd.wap.wmlscript"}, _
  426. {"wmlsc", "application/vnd.wap.wmlscriptc"}, _
  427. {"wrl", "model/vrml"}, _
  428. {"xbm", "image/x-xbitmap"}, _
  429. {"xht", "application/xhtml+xml"}, _
  430. {"xhtml", "application/xhtml+xml"}, _
  431. {"xls", "application/vnd.ms-excel"}, _
  432. {"xml", "application/xml"}, _
  433. {"xpm", "image/x-xpixmap"}, _
  434. {"xsl", "application/xml"}, _
  435. {"xslt", "application/xslt+xml"}, _
  436. {"xul", "application/vnd.mozilla.xul+xml"}, _
  437. {"xwd", "image/x-xwindowdump"}, _
  438. {"xyz", "chemical/x-xyz"}, _
  439. {"zip", "application/zip"} _
  440. }
Add Comment
Please, Sign In to add comment