In C#, how can I know the file type from a byte[]? In C#, how can I know the file type from a byte[]? arrays arrays

In C#, how can I know the file type from a byte[]?


As mentioned, MIME magic is the only way to do this. Many platforms provide up-to-date and robust MIME magic files and code to do this efficiently. The only way to do this in .NET without any 3rd party code is to use FindMimeFromData from urlmon.dll. Here's how:

public static int MimeSampleSize = 256;public static string DefaultMimeType = "application/octet-stream";[DllImport(@"urlmon.dll", CharSet = CharSet.Auto)]private extern static uint FindMimeFromData(    uint pBC,    [MarshalAs(UnmanagedType.LPStr)] string pwzUrl,    [MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer,    uint cbSize,    [MarshalAs(UnmanagedType.LPStr)] string pwzMimeProposed,    uint dwMimeFlags,    out uint ppwzMimeOut,    uint dwReserverd);public static string GetMimeFromBytes(byte[] data) {    try {        uint mimeType;        FindMimeFromData(0, null, data, (uint)MimeSampleSize, null, 0, out mimeType, 0);        var mimePointer = new IntPtr(mimeType);        var mime = Marshal.PtrToStringUni(mimePointer);        Marshal.FreeCoTaskMem(mimePointer);        return mime ?? DefaultMimeType;    }    catch {        return DefaultMimeType;    }}

This uses the Internet Explorer MIME detector. This is the same code used by IE to send a MIME type along with uploaded files. You can see the list of MIME types supported by urlmon.dll. One thing to watch out for is image/pjpeg and image/x-png which are non-standard. In my code I replace these with image/jpeg and image/png.


Not sure, but maybe you should investigate about magic numbers.

Update:Reading about it, I don't think it's very reliable though.


You can't know it from the byte stream, but you can store the MIME type when you initially populate the byte[].