zoukankan      html  css  js  c++  java
  • 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
            }
        }

    为什么只读取部分长度呢 因为 加载所有的 没必要  也浪费内存

  • 相关阅读:
    System.Runtime.InteropServices.COMException (0x800706BA) 解决方法
    Win7 不能安装 msi 解决办法
    note 1 对象和数据类型
    note 0 Python介绍及Python IDE环境安装 Spyder with Anaconda
    无法获得锁 /var/lib/dpkg/lock
    keil5 MDK 链接报错 Error: L6410W 解决
    手动卸载CAD 删除残留文件 清理遗留的文件
    keil5 MDK warning:registered ARM compiler version not found in path
    干掉hao123劫持浏览器主页
    Win7 无法访问Installer服务
  • 原文地址:https://www.cnblogs.com/burg-xun/p/11934501.html
Copyright © 2011-2022 走看看