您的位置:首页 > 其它

在上传文件时限制上传文件的大小,并捕捉超过文件大小限制的异常

2015-08-21 16:14 357 查看
在上传文件时,我们可以在web.config里设置允许上传的文件大小。但是,当上传的文件超过设置的限制时,在Application_Error事件里是无法捕捉到这个异常的。下面,就是捕捉上传文件超过设置大小的方法:

首先,在web.config里设置允许一次上传的文件的总大小;

 

[xhtml]
view plaincopy

Web.config 文件  
<httpRuntime maxRequestLength="400" executionTimeout="3600" appRequestQueueLimit="10000"/>  

 
 

其次,在Global里加入如下的代码:

[c-sharp]
view plaincopy

<%@ Application Language="C#" %>  
<%@ Import Namespace="System.Web.Configuration" %>  
<mce:script RunAt="server"><!--  
  protected void Application_BeginRequest(object sender, EventArgs e)  
  {  
    //本代码的功能是检查页面请求的大小,如果超过了配置文件maxRequestLength的设定值,就提示用户超过了所允许的文件大小。  
      
      
    //从配置文件里得到配置的允许上传的文件大小  
    HttpRuntimeSection runTime = (HttpRuntimeSection)WebConfigurationManager.GetSection("system.web/httpRuntime");  
    //maxRequestLength 为整个页面的大小,不仅仅是上传文件的大小,所以扣除 100KB 的大小,  
    //maxRequestLength单位为KB  
    int maxRequestLength = (runTime.MaxRequestLength - 100) * 1024;  
    //当前请求上下文的HttpApplication实例  
    HttpContext context = ((HttpApplication)sender).Context;  
      
    //判断请求的内容长度是否超过了设置的字节数  
    if (context.Request.ContentLength > maxRequestLength)  
    {  
      //得到服务对象  
      IServiceProvider provider = (IServiceProvider)context;  
      HttpWorkerRequest workerRequest = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));  
      //检查请求是否包含正文数据  
      if (workerRequest.HasEntityBody())  
      {          
        //请求正文数据的长度  
        int requestLength = workerRequest.GetTotalEntityBodyLength();  
        //得到加载的初始字节数  
        int initialBytes = 0;  
        if (workerRequest.GetPreloadedEntityBody() != null)  
          initialBytes = workerRequest.GetPreloadedEntityBody().Length;  
          
        //检查是否所有请求数据可用  
        if (!workerRequest.IsEntireEntityBodyIsPreloaded())  
        {  
          byte[] buffer = new byte[512000];   
          //设置要接收的字节数为初始字节数  
          int receivedBytes = initialBytes;  
          //读取数据,并把所有读取的字节数加起来,判断总的大小  
          while (requestLength - receivedBytes >= initialBytes)  
          {  
            //读取下一块字节  
            initialBytes = workerRequest.ReadEntityBody(buffer, buffer.Length);  
            //更新接收到的字节数  
            receivedBytes += initialBytes;  
          }  
          initialBytes = workerRequest.ReadEntityBody(buffer, requestLength - receivedBytes);  
        }  
      }  
      //请求重定向到上载页面,并给用户提示信息。  
      context.Response.Redirect(this.Request.Url.LocalPath + "?error=" + Server.UrlEncode("您上传的文件超过了允许的大小。"));  
    }  
  }  
// --></mce:script>  

 
最后,上传的页面设置如下:

[c-sharp]
view plaincopy

<%@ Page Language="C#" %>  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<mce:script runat="server"><!--  
  protected void Button1_Click(object sender, EventArgs e)  
  {  
    FileUpload1.SaveAs(Server.MapPath("~") + "//" + System.IO.Path.GetFileName(FileUpload1.FileName));  
    err.Text = "";  
  }  
  protected void Page_Load(object sender, EventArgs e)  
  {  
    if (!String.IsNullOrEmpty(Request.QueryString["error"]))  
    {  
      err.Text = Server.HtmlEncode(Request.QueryString["error"]);  
    }  
  }  
// --></mce:script>  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head runat="server">  
  <title></title>  
</head>  
<body>  
  <form id="form1" runat="server" action="?">  
  <asp:FileUpload ID="FileUpload1" runat="server" />  
  <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="上载" />  
  <div><asp:Label ID="err" runat="server" ForeColor="Red"></asp:Label></div>  
  </form>  
</body>  
</html>  

 
 

 

转自孟子E章 - 原文连接http://dotnet.aspx.cc/file/Catch-maxRequestLength-Exceptions-When-Uploading-File-in-ASPNET.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: