前提概述: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 } }
为何只读取部分长度呢 由于 加载全部的 不必 也浪费内存图片