C# 判断文件格式的一些总结
2021-01-27 12:14
标签:bsp 部分 只读 class 后缀名 tiff 类型 builder bmp 前提概述: 项目中 经常会有上传图片的地方 有的时候需要对图片类型做一些要求 这个时候就需要一些判断 虽然前段上传的时候可以去做类型的限制 或者后台接受的时候从file的type 中获取图片类型 但是这仅仅是表面的验证 这都是基于文件的后缀名称做的验证 但是需要验证真真的原生图片类型 需要去读取文件的二进制 从文件的表头信息做一些判断 为什么要这么麻烦呢~ 原因是因为 由于之前项目使用的是System.Drawing.Image 这个类库去加载文件流 从而去获取图片格式 然后去判断 但是由于在搬迁代码的时候 站点使用的是net core 2.1 本地运行是没问题 有这个类库 但是上了预发以后由于运行环境确少类库 一直在报错 就没法使用了 所以今天刚好组内讨论到这个事情 上午就自己整理下 希望后期能用到 和大家做下分享 代码如下: 为什么只读取部分长度呢 因为 加载所有的 没必要 也浪费内存 C# 判断文件格式的一些总结 标签:bsp 部分 只读 class 后缀名 tiff 类型 builder bmp 原文地址:https://www.cnblogs.com/burg-xun/p/11934501.htmlpublic 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
}
}