• 推荐
  • 评论
  • 收藏

ASP.NET 判断上传文件类型的方法大全

2020-08-22    3850次浏览

一、 判断文件名后缀

安全性比较低,比如:把文本文件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;

}