public static FileType DetectMimeType(this Stream stream) { var tmp = MimeTypes.AllTypes.Select(x => x.HeaderOffset + x.Header.Length).OrderByDescending(x => x) .FirstOrDefault(); var data = new byte[tmp]; stream.Read(data, 0, data.Length); stream.Position = 0; IEnumerable <byte?> GetHeader(FileType t) => data .Skip(t.HeaderOffset) .Take(t.Header.Length) .Cast <byte?>(); var comparer = new IgnoreNullComparer(); var result = MimeTypes.AllTypes .OrderByDescending(t => t.Header.Length) .FirstOrDefault(t => t.Header.SequenceEqual(GetHeader(t), comparer)); if (result == null) { return(null); } if (!result.Equals(MimeTypes.ZIP)) { return(result); } return(CheckForMsOfficeTypes(stream) ?? MimeTypes.ZIP); }
public static FileType DetectMimeType(this byte[] file) { IEnumerable <byte?> GetHeader(FileType t) => file .Skip(t.HeaderOffset) .Take(t.Header.Length) .Cast <byte?>(); var comparer = new IgnoreNullComparer(); var result = MimeTypes.AllTypes .FirstOrDefault(t => t.Header.SequenceEqual(GetHeader(t), comparer)); if (result == null) { return(null); } if (!result.Equals(MimeTypes.ZIP)) { return(result); } using (var ms = new MemoryStream(file)) { return(CheckForDocxAndXlsx(ms) ?? MimeTypes.ZIP); } }
public static FileType DetectMimeType(this byte[] file) { var comparer = new IgnoreNullComparer(); var result = MimeTypes.AllTypes .OrderByDescending(t => t.Signatures.Length) .ThenByDescending(t => t.Signatures.Sum(s => s.SignatureBytes.Length)) .FirstOrDefault(t => t.Signatures.All(s => s.SignatureBytes.SequenceEqual(GetSignature(file, s), comparer))); if (result == null) { return(DefaultFallback); } if (result.Equals(MimeTypes.MCF)) { return(CheckForMsOldOfficeTypes(file) ?? DefaultFallback); } if (!result.Equals(MimeTypes.ZIP)) { return(result); } using (var ms = new MemoryStream(file)) { return(CheckForMsOfficeTypes(ms) ?? MimeTypes.ZIP); } }