前提概述:
项目中 经常会有上传图片的地方 有的时候需要对图片类型做一些要求 这个时候就需要一些判断 虽然前段上传的时候可以去做类型的限制 或者后台接受的时候从file的type 中获取图片类型 但是这仅仅是表面的验证 这都是基于文件的后缀名称做的验证 但是需要验证真真的原生图片类型 需要去读取文件的二进制 从文件的表头信息做一些判断 为什么要这么麻烦呢~ 原因是因为 由于之前项目使用的是System.Drawing.Image 这个类库去加载文件流 从而去获取图片格式 然后去判断 但是由于在搬迁代码的时候 站点使用的是net core 2.1 本地运行是没问题 有这个类库 但是上了预发以后由于运行环境确少类库 一直在报错 就没法使用了
所以今天刚好组内讨论到这个事情 上午就自己整理下 希望后期能用到 和大家做下分享
代码如下:
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 } }
为什么只读取部分长度呢 因为 加载所有的 没必要 也浪费内存