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 = ;
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
}
}
为什么只读取部分长度呢 因为 加载所有的 没必要 也浪费内存
C# 判断文件格式的一些总结的更多相关文章
- js判断文件格式及大小
//判断照片大小 function getPhotoSize(obj){ photoExt=obj.value.substr(obj.value.lastIndexOf(".&q ...
- ASP.NET通过byte正确安全的判断上传文件格式
本文介绍一种更安全的方式上传图片,他能有效的防止一些通过修改文件后缀或MIME来伪造的图片的上传,从而保证服务器的安全,希望对大家有所帮助. ASP.NET中在判断文件格式时,我们以前常用的方法就是通 ...
- 上传伪技术~很多人都以为判断了后缀,判断了ContentType,判断了头文件就真的安全了。是吗?
今天群里有人聊图片上传,简单说下自己的经验(大牛勿喷) 0.如果你的方法里面是有指定路径的,记得一定要过滤../,比如你把 aa文件夹设置了权限,一些类似于exe,asp,php之类的文件不能执行,那 ...
- C#判断文件及文件夹是否存在并创建(C#判断文件夹存在)
protected void Button1_Click(object sender, EventArgs e) { if (Directory.Exists(Server.MapPath(" ...
- C#根据文件流判断文件类型
判断文件真实的类型,不是通过扩展名来判断: /// <summary> /// 判断文件格式 /// http://www.cnblogs.com/babycool /// </su ...
- C#判断文件和文件夹是否存在 不存在则创建
using System.IO;string path = @"D:\accountDaoRu\"; if (Directory.Exists(path) == fa ...
- C#取得控制台应用程序的根目录方法 判断文件夹是否存在,不存在就创建
取得控制台应用程序的根目录方法1:Environment.CurrentDirectory 取得或设置当前工作目录的完整限定路径2:AppDomain.CurrentDomain.BaseDirect ...
- [开发笔记]-C#判断文件类型
判断文件真实的类型,不是通过扩展名来判断: /// <summary> /// 判断文件格式 /// http://www.cnblogs.com/babycool /// </su ...
- flash从数据流判断图片格式防止xss攻击
前段时间测试人员报了一个flash的xss bug,经分析用了Loader.loadBytes且没做数据流格式校验的程序都会中招,自测方法只需一行代码: ExternalInterface.call( ...
随机推荐
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(十三)之Strings
Immutable Strings Objects of the String class are immutable. If you examine the JDK documentation fo ...
- ES6新特性箭头函数和常用function()对比
// 无参 var fn1 = function() {} var fn1 = () => {} // 单个参数 var fn2 = function(a) {} var fn2 = a =&g ...
- D3js怎么获得SVG及其子元素在屏幕中的坐标
var clientRects = svg.select("image").node().getBoundingClientRect(); var coordinates = [ ...
- WinForm:API
一.WndProc: 主要用在拦截并处理系统消息和自定义消息 比如:windows程序会产生很多消息,比如你单击鼠标,移动窗口都会产生消息.这个函数就是默认的消息处理函数.你可以重载这个函数来制定自 ...
- stand up meeting 1--11
今天国庆同学回中科大考试因此缺席了今天的daily scrum.不过国庆的任务已经基本完成,不会影响项目进度. 今日更新: 分享功能已经完成一个版本,如下图为分享至邮件: 针对AP返回结果中没有Wor ...
- java对象头信息和三种锁的性能对比
java头的信息分析 首先为什么我要去研究java的对象头呢? 这里截取一张hotspot的源码当中的注释 这张图换成可读的表格如下 |-------------------------------- ...
- Redis的三大问题
一般我们对缓存读操作的时候有这么一个固定的套路: 如果我们的数据在缓存里边有,那么就直接取缓存的. 如果缓存里没有我们想要的数据,我们会先去查询数据库,然后将数据库查出来的数据写到缓存中. 最后将数据 ...
- Golang交付至Kubernetes
目录 0.前言 1.Go服务构建 1.1.制作Go服务镜像底包 1.2.制作slave基础镜像底包 1.2.1.Golang镜像 1.2.2.Docker镜像 2.创建golang流水线 3.流水线构 ...
- ST3 package control
view-> showconsole (ctrl+`) import urllib.request,os,hashlib; h = 'df21e130d211cfc94d9b0905775 ...
- 2019-2020-1 20199325《Linux内核原理与分析》第九周作业
第九周作业要求: 理解Linux系统中进程调度的时机,可以在内核代码中搜索schedule()函数,看都是哪里调用了schedule(),判断我们课程内容中的总结是否准确: 使用gdb跟踪分析一个sc ...