前提概述: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 } }
爲何只讀取部分長度呢 由於 加載全部的 不必 也浪費內存圖片