FileUpload文件上传控件

本文详细介绍了ASP.NET 2.0中FileUpload控件的功能与使用方法,包括基本上传流程、大型文件上传配置、多个文件上传处理、以及如何限制文件上传类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以往ASP.NET 1.0只能使用Client端的Input(File)进行文件上传,但功能略为简单;而ASP.NET 2.0则内置了服务器端的FileUpload文件上传控件,它的功能比Input(File)功能更丰富强大。FileUpload提供了更大的操控性,使开发可以介入到更底层的操控,这是Input(File)所不可及的。

以下提供一个上传的示例:

protected void btnUpload_Click(object sender,EventArgs e)
{
    if (FileUpload1.HasFile)
    {
        try
        {

            //获取网站根目录路径
            string path = HttpContext.Current.Request.MapPath("~/");
            //存储文件到磁盘
            FileUpload1.SaveAs(path + FileUpload1.FileName);
            //文件大小
            int size = FileUpload1.PostedFile.ContentLength;
            //文件类型
            string type = FileUpload1.PostedFile.ContentType;
        }
        catch
        {

        }
    }
    else
    {
        Response.Write("<script language=\"JavaScript\">alert(\"必须指定文件!\")</script>");
    }
}

程序说明:

  1. FileUpload1.HasFile用来检查FileUpload控件是否有指定文件;
  2. HttpContext.Current.Request.MapPath("~/")获取网站所在磁盘的绝对路径。之所以这么做,是因为FileUpload控件必须指定“绝对路径”,而非相对路径,同时绝对路径也必须具有写入权限;
  3. FileUpload1.SaveAs()是将上传文件存储在磁盘的方法;
  4. FileUpload1.FileName用于获取上传文件的名称;
  5. FileUpload1.PostedFile.ContentLength用于获取上传文件的大小,以Byte为单位;
  6. FileUpload1.PostedFile.ContentType用于获取上传文件的Mime类型。

关于上传大型文件

    上传过程中,若上传大型文件(例如:10MB),上传会报错并中断,发生这种情况的原因在于系统默认限制上传文件的大小为 4096KB,因此只要上传文件超过这个限制就会产生错误并中断。若想解除这个限制,就必须调整 maxRequestLength 长度限制。在Web.Config文件中做如下设置:

    <configuration>

        <system.web>

            <httpRuntime maxRequestLength="4096" executionTimeout="120"/>

        </system.web>

    </configuration>

设置说明:

  1. maxRequestLength 属性限制上传文件的大小,以 KB 为单位,默认值为 4096KB,最大上限为 2097151KB,大约为 2GB;
  2. executionTimeout 属性限制上传文件的时间,以 秒(s)为单位,默认值为 90s,如果考虑到所设计的Web应用系统上传时间要超过 90s,可延长设定值。

FileUpload控件多个上传文件

    一次上传多个文件要比一次只上传一个文件需要更多的防呆程序。

    protected void btnUpload_Click(object sender, EventArgs e)
    {
        try
        {
            Upload(FileUpload1);
            Upload(FileUpload2);
            //...
            //ViewState["Uploads"]
        }
        catch
        {

        }
    }
    protected void Upload(FileUpload myFileUpload)
    {
        string path = HttpContext.Current.Request.MapPath("~/");
        if (myFileUpload.HasFile)
        {
            try
            {
                myFileUpload.SaveAs(path + myFileUpload.FileName);
                ViewState["Uploads"] += myFileUpload.PostedFile.FileName.ToString() + "<br>";
            }
            catch
            {

            }
        }
        else
        {
            //检查至少必须指定一个上传文件
            if (hasFile())
            {
                Response.Write("<script language=\"JavaScript\">alert(\"必须指定文件!\")</script>");
            }
        }
    }
    protected bool hasFile()
    {
        //定义status变量,指示是否包含文件,默认false
        bool status = false;
        status = (FileUpload1.HasFile || FileUpload2.HasFile);
        return status;
    }

    由于多个文件上传会涉及 Web.Config 中 maxRequestLength 文件上传的大小,因此有必要让用户知道系统目前限制值是多少。

    首先引用 System.Web.Configuration 命名空间

    protected void getUploadSize()
    {
        //开启网站的 Web.Config 配置文件
        Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
        //获取 system.web/httpRuntime 配置区块
        HttpRuntimeSection myHttpRuntimeSection = (HttpRuntimeSection)config.GetSection("system.web/httpRuntime");
        //获取文件上传最大限制值
        int size = myHttpRuntimeSection.MaxRequestLength;
        Response.Write("<script>alert(\"" + size.ToString() + "\")</script>");
        //设置文件上传最大限制值
        myHttpRuntimeSection.MaxRequestLength = 10240;
       
    }

    多个文件上传似乎是以“异步”方式进行的,即假定上传十个文件,并非一个上传结束再开始上传下一个,而是十个文件同时上传。由于同时有十个 FileUpload实体在各自进行数据上传及写入磁盘操作,且一旦上传操作开始,就无法通过关闭 IE 来终止(用大型文件测试便知),必须关闭 IIS 的 Process 才行。

 

限制 FileUpload 的文件上传类型

protected void setUploadType()
    {
        string path = HttpContext.Current.Request.MapPath("~/");
        //定义变量 fileAllowToUpload 根据上传文件类型指示是否允许上传
        bool fileAllowToUpload = false;
        //定义字符串数组 allowExtensions 表示允许上传的文件类型
        string[] allowExtensions = { ".doc", ".xls", ".ppt", ".jpg", ".gif" };
        //获取网站根目录
        string path = HttpContext.Current.Request.MapPath("~/");
        if (FileUpload1.HasFile)
        {
            string fileExtension = Path.GetExtension(FileUpload1.FileName).ToLower();
            //检查上传文件的扩展名是否符合限定类型
            for (int i = 0; i < allowExtensions.Length; i++)
            {
                if (fileExtension == allowExtensions[i])
                {
                    fileAllowToUpload = true;
                }
            }
            if (fileAllowToUpload)
            {
                try
                {
                    //存储文件到磁盘
                    FileUpload1.SaveAs(path + FileUpload1.FileName);
                }
                catch
                {

                }
            }
            else
            {
                Response.Write("<script language=\"JavaScript\">alert(\"不是允许的类型!\")</script>");
            }
        }
    }

 

    FileUpload 的一处最大的优点,就是可以做出“真实的”实时上传进度监控和已上传 Bytes 数的实时变化,这部分将后续补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值