前提概述:
項目中 經常會有上傳圖片的地方 有的時候需要對圖片類型做一些要求 這個時候就需要一些判斷 雖然前段上傳的時候可以去做類型的限制 或者后台接受的時候從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 } }
為什么只讀取部分長度呢 因為 加載所有的 沒必要 也浪費內存