C# 判斷文件格式的一些總結


前提概述:

項目中 經常會有上傳圖片的地方  有的時候需要對圖片類型做一些要求   這個時候就需要一些判斷   雖然前段上傳的時候可以去做類型的限制  或者后台接受的時候從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
        }
    }

為什么只讀取部分長度呢 因為 加載所有的 沒必要  也浪費內存

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM