以前发过一个.NET上传文件的方法的,不过那个方法中对文件类型的判断只是对后缀名来进行判断的,这样假如我把一个txt文本文件的后缀名改为jpg了也可以上传,这样无意中就造成了安全问题。
刚刚从网上找了个方法,试验了一下,是能够辨认出正确的文件类型的,如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;

public partial class niunantest : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

}
    protected void Button1_Click(object sender, EventArgs e)
    {
        string str = FileUpload1.PostedFile.ContentType;
        Response.Write("文件类型:"+str);

string filename = "";

FileExtension[] fe = { FileExtension.GIF, FileExtension.JPG, FileExtension.PNG };
        if (FileValidation.IsAllowedExtension(FileUpload1, fe))
        {
            string fileExt = System.IO.Path.GetExtension(FileUpload1.FileName).ToLower();
            Response.Write("<br>验证通过!");
            //filename = "/Images/" + DateTime.Now.ToString("yyyyMMddHHmmss") + fileExt;
            //FileUpload1.PostedFile.SaveAs(Server.MapPath(filename));
        }
        else
        {
            Response.Write( "<br>验证不通过,只支持以下格式的图片:JPG,GIF,PNG");
            return;
        }

}

public enum FileExtension
    {
        JPG = 255216,
        GIF = 7173,
        PNG = 13780,
        SWF = 6787,
        RAR = 8297,
        ZIP = 8075,
        _7Z = 55122

// 255216 jpg;

// 7173 gif;

// 6677 bmp,

// 13780 png;

// 6787 swf

// 7790 exe dll,

// 8297 rar

// 8075 zip

// 55122 7z

// 6063 xml

// 6033 html

// 239187 aspx

// 117115 cs

// 119105 js

// 102100 txt

// 255254 sql

}

public class FileValidation
    {
        public static bool IsAllowedExtension(FileUpload fu, FileExtension[] fileEx)
        {
            int fileLen = fu.PostedFile.ContentLength;
            byte[] imgArray = new byte[fileLen];
            fu.PostedFile.InputStream.Read(imgArray, 0, fileLen);
            MemoryStream ms = new MemoryStream(imgArray);
            System.IO.BinaryReader br = new System.IO.BinaryReader(ms);
            string fileclass = "";
            byte buffer;
            try
            {
                buffer = br.ReadByte();
                fileclass = buffer.ToString();
                buffer = br.ReadByte();
                fileclass += buffer.ToString();
            }
            catch
            {
            }
            br.Close();
            ms.Close();
            foreach (FileExtension fe in fileEx)
            {
                if (Int32.Parse(fileclass) == (int)fe)
                    return true;
            }
            return false;
        }
    }
}

个人理解:上面的代码中判断文件类型的应该是把文件转成二进制的字节,然后取开头2个字节,这样看来的话开头2个字节就表示文件的类型...

转载于:https://www.cnblogs.com/niunan/archive/2009/09/04/1560292.html

ASP.NET上传文件对文件类型的高级判断相关推荐

  1. ASP.NET上传下载文件

    ASP.NET上传下载文件 上传文件: using System; using System.Collections.Generic; using System.Linq; using System. ...

  2. Asp.net上传文件至目录

    Asp.net上传文件,把文件存入至目录中.限制上传文件大小,限制上传文件格式.存取得原来文件名,创建新的文件名. 把文件临时存入临时目录中,处理完毕,最后再移至真正目录. 参考代码:  //上传时, ...

  3. Asp.Net 上传大文件

    HttpModule.cs 代码 namespace WebUploadFile {     public class HttpUploadModule : IHttpModule     {     ...

  4. asp.net 上传大文件解决方案(转)

    这次在项目中,用到了大文件上传,要上传的文件有100多m,于是研究现在国内使用的大文件上传的 组件发现用的比较多的有两个控件AspnetUpload 2.0和Lion.Web.UpLoadModule ...

  5. asp.net 2.0中允许一次上传多个文件的设计

    在asp.net 2.0中,可以结合dhtml来实现在用户上传完一个文件后,再点"继续上传",而动态增加上传文件框 首先是前台的页面 <script language=&qu ...

  6. asp.net 上传大文件控件

    这段时间写了个asp.net 上传大文件控件.经过测试,在ie中可显示进度条.特此共享,望广大网友多提意见. 大文件上传控件(包含进度条) 使用说明如下: <summary>      上 ...

  7. 服务器上传excel文件并读取数据,asp.net上传Excel文件并读取数据的实现方法

    前言 本文主要给大家介绍了关于asp.net上传Excel文件并读取数据的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 实现如下: 前台代码:使用服务端控件实现上传 服务端 ...

  8. Asp.Net 上传大文件专题(4)--利用ajax技术显示上传进度

    ====================================================== 注:本文源代码点此下载 ================================= ...

  9. ASP.NET上传文件出现“404-找不到文件或目录”的解决办法

    ASP.NET的程序部署在IIS7环境下,上传大文件时出现"404-找不到文件或目录"的错误,如下图: <system.web> <httpRuntime use ...

  10. 自学Python第二十二天- Django框架(三) AJAX、文件上传、POST 请求类型之间的转换、多APP开发、iframe、验证码、分页器、类视图、中间件、信号、日志、缓存、celery异步

    Django官方文档 django 使用 AJAX django 项目中也可以使用 ajax 技术 前端 前端和其他 web 框架一样,需要注意的是,django 接收 POST 请求时,需要 csr ...

最新文章

  1. 用Duplex实现消息广播
  2. Function类型
  3. Linux内核学习笔记十一——I/O层和I/O调度机制
  4. short 类型的大小为( )个字节。_2008-2012,张一鸣在豆瓣书影音为字节跳动埋下的5个彩蛋...
  5. Git 分支 - rebase 变基
  6. C++应用过程中使用知识点
  7. SQLServer 数据库主体在该数据库中拥有 架构,无法删除解决方法
  8. Spring Boot 2.X 如何优雅的解决跨域问题?
  9. linux机器光口和电口的区别,易天光通信SFP电口模块和10G SFP+电口模块介绍
  10. 字符串反转的进一步应用----单词反转
  11. oracle数据库下载地址
  12. 基于R语言的分位数回归(quantile regression)
  13. 3.APP推广有哪些渠道
  14. 三维导热问题的ADI-TDMA算法
  15. Android手机界面组成
  16. 搜狗搜索图片查看器调用帮助
  17. CSS3实现流星动画
  18. NDK实践(一)在linux环境下编译ffmpe
  19. 欧几里得《几何原本》电子版的内容大纲
  20. .NetCore后台使用QrCode.Net根据网络链接生成二维码

热门文章

  1. 编码实现字符串转整型的函数(实现函数atoi的功能)
  2. eclipse+adt下开发android微信红包自动抢(AccessibilityService类)
  3. 天线开路短路检测原理_变频空调通讯电路原理与元件级维修
  4. 为帐户创建一个Apex触发器,以根据自定义字段将送货地址邮政编码与账单地址邮政编码匹配
  5. JQuery对象和JS对象区别与转换|| 事件绑定 入口函数 样式控制
  6. javascript引用类型
  7. Windows 技术篇-Edge浏览器升级方法实例演示,微软官方应用商店访问下载edge慢解决方法,edge安装包获取
  8. MySQL 数据库show processlist where条件筛选报错解决方法,[Code: 1064, SQL State: 42000] You have an error in your
  9. Maximum Depth of Binary Tree
  10. pyrMeanShiftFiltering函数