前提概述:

项目中 经常会有上传图片的地方  有的时候需要对图片类型做一些要求   这个时候就需要一些判断   虽然前段上传的时候可以去做类型的限制  或者后台接受的时候从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 = ;
StringBuilder stringBuilder = new StringBuilder();
while (length > )
{
byte tempByte = br.ReadByte();
stringBuilder.Append(Convert.ToString(tempByte, ));
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
}
}

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

最新文章

  1. JavaWeb配置外部应用的两种方式
  2. 【小白的CFD之旅】17 需要编程?
  3. iOS 在UITableViewCell中加入自定义view时view的frame设定注意
  4. MFC 设置控件事件对应的函数
  5. js中test,exec和match方法
  6. wampserver下升级php7
  7. [LeetCode][Python]Longest Substring Without Repeating Characters
  8. Object-C面向对象之实现类
  9. ThinkPHP中foreach和volist的区别
  10. CDH集群搭建部署
  11. 【npm】如何在Atom中安装emmet和atom-beautify插件?
  12. Composer创建和发送HTTP Request
  13. VIM 自定义语法高亮配置
  14. springboot+redis实现分布式session共享
  15. 按此格式写你的distributionUrl,可以直接用本地的gradle包
  16. JMeter命令行执行及问题解决 Error in NonGUIDriver java.lang.RuntimeException: Could not find the TestPlan class!
  17. Js 中对 Json 数组的常用操作
  18. mysql insert插入的3种方法
  19. react & monaco editor & vs code
  20. vs2015新功能和其他

热门文章

  1. webWMS开发过程记录(二)- WMS是什么
  2. 理解SVG的缩放 偏移的计算公式
  3. TcxLookupComboBox
  4. python嵌套列表知多少
  5. 并发工具——CyclicBarrier
  6. 通过dockerfile制作镜像
  7. javascript实例教程使用canvas技术模仿echarts柱状图
  8. Upload-Labs 实验操作记录
  9. 初探Redis-基础类型String
  10. HTML+CSS教程(二)frameset框架和iframe内嵌