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);
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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);
            }
        }