C# 判断文件格式的一些总结
2024-09-07 12:17:40
前提概述:
项目中 经常会有上传图片的地方 有的时候需要对图片类型做一些要求 这个时候就需要一些判断 虽然前段上传的时候可以去做类型的限制 或者后台接受的时候从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
}
}
为什么只读取部分长度呢 因为 加载所有的 没必要 也浪费内存
最新文章
- JavaWeb配置外部应用的两种方式
- 【小白的CFD之旅】17 需要编程?
- iOS 在UITableViewCell中加入自定义view时view的frame设定注意
- MFC 设置控件事件对应的函数
- js中test,exec和match方法
- wampserver下升级php7
- [LeetCode][Python]Longest Substring Without Repeating Characters
- Object-C面向对象之实现类
- ThinkPHP中foreach和volist的区别
- CDH集群搭建部署
- 【npm】如何在Atom中安装emmet和atom-beautify插件?
- Composer创建和发送HTTP Request
- VIM 自定义语法高亮配置
- springboot+redis实现分布式session共享
- 按此格式写你的distributionUrl,可以直接用本地的gradle包
- JMeter命令行执行及问题解决 Error in NonGUIDriver java.lang.RuntimeException: Could not find the TestPlan class!
- Js 中对 Json 数组的常用操作
- mysql insert插入的3种方法
- react &; monaco editor &; vs code
- vs2015新功能和其他