大文件上传之异常处理
2007-03-01 13:36
483 查看
等Application_Error事件处理捕获到“Maximum request length exceeded.”异常为时已晚,页面已无法正常Redirect至Custom Error Page,因此应该设法使系统不抛出“Maximum request length exceeded.”异常。而要使系统不抛出该异常,就应在HttpHandler处理Request之前,使HttpHandler得到的HttpContext的内容小于maxRequestLength。看来,可以在Global.asax中的Application_BeginRequest事件处理过程中作一番文章。下面的代码就给出了解决方案:
protected void Application_BeginRequest(Object sender, EventArgs e)
{
double maxRequestLength = 4096000 ;
HttpRequest request = HttpContext.Current.Request;
if (request.ContentLength > maxRequestLength)//4096000 is maxRequestLength
{
HttpApplication app = sender as HttpApplication;
HttpContext context = app.Context;
HttpWorkerRequest wr =
(HttpWorkerRequest)(context.GetType().GetProperty
("WorkerRequest", BindingFlags.Instance |
BindingFlags.NonPublic).GetValue(context, null));
byte[] buffer;
if (wr.HasEntityBody())
{
int contentlen = Convert.ToInt32(wr.GetKnownRequestHeader(
HttpWorkerRequest.HeaderContentLength));
buffer = wr.GetPreloadedEntityBody();
int received = buffer.Length;
int totalrecv = received;
if (!wr.IsEntireEntityBodyIsPreloaded())
{
buffer = new byte[65535];
while ( contentlen - totalrecv >= received )
{
received =
wr.ReadEntityBody(buffer,
buffer.Length);
totalrecv += received;
}
received =
wr.ReadEntityBody(buffer, contentlen - totalrecv);
}
}
context.Response.Redirect("./errTimeout.aspx");//Redirect to custom error page.
}
}
从代码可以看出,关键的思路就是:如果上传的文件超过maxRequestLength,则上传文件已可以看作无效文件,于是就可以放心大胆的为其瘦身,使Request的HttpContext的内容小于maxRequestLength,这样“Maximum request length exceeded.”异常就不会再产生,页面也就可以正常跳转到Custom Error Page了。代码中的循环部分就是将上传的文件内容读入buffer中,因为上传文件已属于无效文件,所以文件内容也就不重要,这里buffer的用途仅仅是用来接收上传文件内容,buffer中的数据也无需再被读取。
protected void Application_BeginRequest(Object sender, EventArgs e)
{
double maxRequestLength = 4096000 ;
HttpRequest request = HttpContext.Current.Request;
if (request.ContentLength > maxRequestLength)//4096000 is maxRequestLength
{
HttpApplication app = sender as HttpApplication;
HttpContext context = app.Context;
HttpWorkerRequest wr =
(HttpWorkerRequest)(context.GetType().GetProperty
("WorkerRequest", BindingFlags.Instance |
BindingFlags.NonPublic).GetValue(context, null));
byte[] buffer;
if (wr.HasEntityBody())
{
int contentlen = Convert.ToInt32(wr.GetKnownRequestHeader(
HttpWorkerRequest.HeaderContentLength));
buffer = wr.GetPreloadedEntityBody();
int received = buffer.Length;
int totalrecv = received;
if (!wr.IsEntireEntityBodyIsPreloaded())
{
buffer = new byte[65535];
while ( contentlen - totalrecv >= received )
{
received =
wr.ReadEntityBody(buffer,
buffer.Length);
totalrecv += received;
}
received =
wr.ReadEntityBody(buffer, contentlen - totalrecv);
}
}
context.Response.Redirect("./errTimeout.aspx");//Redirect to custom error page.
}
}
从代码可以看出,关键的思路就是:如果上传的文件超过maxRequestLength,则上传文件已可以看作无效文件,于是就可以放心大胆的为其瘦身,使Request的HttpContext的内容小于maxRequestLength,这样“Maximum request length exceeded.”异常就不会再产生,页面也就可以正常跳转到Custom Error Page了。代码中的循环部分就是将上传的文件内容读入buffer中,因为上传文件已属于无效文件,所以文件内容也就不重要,这里buffer的用途仅仅是用来接收上传文件内容,buffer中的数据也无需再被读取。
相关文章推荐
- RxJava + Retrofit+okhttp 封装,包含对相同格式请求数据、相同格式返回数据处理,显示 Material Design 加载 dialog,文件上传下载进度展示、全局异常捕捉。
- ASP 上传文件时,发生了未处理的异常 007 asp 0104不允许操作
- Spring MVC 全局异常处理&文件上传
- Struts2文件上传,以及上传拦截异常国际化处理
- 7. spring MVC 拦截器组件,异常处理,文件上传
- Hadoop上传文件到HDFS时异常处理步骤
- SpringMVC multipart文件上传详细教程之二:控制器的编写及异常处理
- SpringMVC 上传文件异常处理
- spring上传文件并限制大小配置以及全局异常处理
- springMVC高级部分(数据校验,数据错误回显(自定义格式错误显示),拦截器,异常处理,文件上传,文件下载,springmvc运行流程以及springmvc和struts2对比)
- ASP.NET WebApi 上传文件时异常 Failed to execute send on XMLHttpRequest 的一个处理方法
- springmvc 异常处理、文件上传以及拦截器相关知识
- SpringMVC之文件上传异常处理
- Struts2文件上传,以及上传拦截异常国际化处理
- Beginning Spring学习笔记——第3章(三)文件上传、异常处理和个性化
- Struts中文件上传时的空指针异常处理以及获取不到上传文件相关属性
- ASP.NET 用.Net的File控件上传文件大文件上传之异常处理 的解决方案
- Laravel 上传文件异常处理
- spring mvc CommonsMultipartResolver上传文件异常处理
- 上传下载文件实例异常:java.lang.IllegalStateException怎么解决?