C# 判断文件格式的一些总结

前提概述:ui

项目中 常常会有上传图片的地方  有的时候须要对图片类型作一些要求   这个时候就须要一些判断   虽然前段上传的时候能够去作类型的限制  或者后台接受的时候从file的type 中获取图片类型  可是这仅仅是表面的验证  这都是基于文件的后缀名称作的验证  可是须要验证真真的原生图片类型  须要去读取文件的二进制  从文件的表头信息作一些判断   为何要这么麻烦呢~ 缘由是由于  因为以前项目使用的是System.Drawing.Image 这个类库去加载文件流 从而去获取图片格式 而后去判断 可是因为在搬迁代码的时候 站点使用的是net core 2.1 本地运行是没问题  有这个类库 可是上了预发之后因为运行环境确少类库 一直在报错    就无法使用了spa

因此今天恰好组内讨论到这个事情 上午就本身整理下  但愿后期能用到 和你们作下分享code

代码以下:blog

public class ImageValidate
    {
        public static (bool, ImageType) ImageValidateByStream(Stream fileStream)
        {
            string imageType = string.Empty;
            using (BinaryReader br = new BinaryReader(fileStream))
            {
                int length = 20;
                StringBuilder stringBuilder = new StringBuilder();
                while (length > 0)
                {
                    byte tempByte = br.ReadByte();
                    stringBuilder.Append(Convert.ToString(tempByte, 16));
                    stringBuilder.Append(",");
                    length--;
                }
                string fileTypeString = stringBuilder.ToString().ToUpper();
                if (string.IsNullOrEmpty(fileTypeString))
                    return (false, ImageType.Error);

                if (fileTypeString.StartsWith("FF,D8,"))
                    return (true, ImageType.JPEG);
                if (fileTypeString.StartsWith("89,50,4E,47,D,A,1A,A,"))
                    return (true, ImageType.PNG);
                if (fileTypeString.StartsWith("42,4D,"))
                    return (true, ImageType.JPEG);
                if (fileTypeString.StartsWith("47,49,46,38,39,61,") || fileTypeString.StartsWith("47,49,46,38,37,61,"))
                    return (true, ImageType.GIF);
                if (fileTypeString.StartsWith("4D,4D") || fileTypeString.StartsWith("49,49"))
                    return (true, ImageType.TIFF);
                if (fileTypeString.StartsWith("46,4F,52,4D"))
                    return (true, ImageType.TIFF);
                return (false, ImageType.Empty);
            }
        }

        public enum ImageType
        {
            Error,
            Empty,
            JPEG,
            BMP,
            PNG,
            GIF,
            TIFF,
            IFF
        }
    }

为何只读取部分长度呢 由于 加载全部的 不必  也浪费内存图片

相关文章
相关标签/搜索