一、 判断文件名后缀
安全性比较低,比如:把文本文件test.txt改成test.png后照样可以上传,但其实现逻辑容易理解,是最初级的文件类型判断方法。
//根据后缀名判断上传文件的正确性
public bool IsImageBySuffix(FileUpload fileUpload)
{
Boolean isFileTrue = false;
//判断是否已经选取文件
if(fileUpload.HasFile)
{
//取得文件的扩展名,并转换成小写
string fileExtension = System.IO.Path.GetExtension(fileUpload.FileName).ToLower();
//限定上传的图片后缀名
string[] allowExtension = { ".jpg", ".gif", ".png", ".jpeg",".bmp"};
//对上传的文件的类型进行一一匹配
for(int i = 0; i < allowExtension.Length; i++)
{
if(fileExtension == allowExtension[i])
{
isFileTrue = true;
break;
}
}
}
else
{
isFileTrue = false;
}
return isFileTrue;
}
二、检测文件MIME类型
媒体类型(通常称为 Multipurpose Internet Mail Extensions 或 MIME 类型 )是一种标准,用来表示文档、文件或字节流的性质和格式。它在IETF RFC 6838中进行了定义和标准化。
//根据文件的MIME类型判断上传文件
public bool IsImageFileByMIMEType(FileUpload fileUpload)
{
Boolean isFileTrue = false;
//判断是否已经选取文件
if(fileUpload.HasFile)
{
//取得文件MIME内容类型
string type = fileUpload.PostedFile.ContentType.ToLower();
if(type.Contains("image")) //图片的MIME类型为"image/xxx",这里只判断是否图片
{
isFileTrue = true;
}
else
{
isFileTrue = false;
}
}
else
{
isFileTrue = false;
}
return isFileTrue;
}
三、根据文件头部数据
根据文件的具体结构数据,实现真正意义上的文件类型判断。
//根据文件的首两个字节进行判断
public bool IsAllowedExtension(string filePath)
{
Boolean isFileTrue = false;
System.IO.FileStream fs = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
System.IO.BinaryReader r = new System.IO.BinaryReader(fs);
string fileData = "";
//读取前两个字节,这里的位长要具体判断.
byte buffer;
try
{
buffer = r.ReadByte();
fileData = buffer.ToString();
buffer = r.ReadByte();
fileData += buffer.ToString();
}
catch (Exception e)
{
throw e;
}
finally
{
r.Close();
fs.Close();
}
//说明255216是jpg;7173是gif;6677是BMP;13780是PNG;7790是exe;8297是rar等等
string [] fileTypes = { "255216", "7173", "6677", "13780" };
foreach(string type in fileTypes)
{
if(fileData == type)
{
isFileTrue = true;
break;
}
}
return isFileTrue;
}