asp.net中c# 怎么做当上传打文件时提示上传文件太大不能上次

kankankankan2222 2012-03-30 05:27:46
上传小文件是成功的。但是当上传大文件的时候直接连程序都不能进去。出异常。也不能弹出“文件太大”的messagebox了
所以我想实现设置只能实现上传小于10mb的 ,当上传大于10mb时跳出一个提示窗口说文件太大。不要连程序都进不去。
求大家想办法。给出程序。或相关链接
...全文
408 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
王锋(oxwangfeng) 2014-08-27
  • 打赏
  • 举报
回复
引用 12 楼 wangzheyongle 的回复:
难得见sp有这么详细精准的回复,我在毕设中对这个问题的处理是自定义了一个httpModules处理,silverlight和active控件的体验尚不如swf啊 [Quote=引用 11 楼 的回复:] 你可以想象一下,把一个15M的文件先传送给服务器,完毕之后服务器程序检查出来其 Request.ContentLength 比设置的大了,所以出错,这是不是实在是太悲剧了啊。这种文件大小限制机制是不是很没有必要啊! [/Quote]
请问是怎么设置的呀
王者永乐 2012-08-03
  • 打赏
  • 举报
回复
难得见sp有这么详细精准的回复,我在毕设中对这个问题的处理是自定义了一个httpModules处理,silverlight和active控件的体验尚不如swf啊
[Quote=引用 11 楼 的回复:]

你可以想象一下,把一个15M的文件先传送给服务器,完毕之后服务器程序检查出来其 Request.ContentLength 比设置的大了,所以出错,这是不是实在是太悲剧了啊。这种文件大小限制机制是不是很没有必要啊!
[/Quote]
  • 打赏
  • 举报
回复
你可以想象一下,把一个15M的文件先传送给服务器,完毕之后服务器程序检查出来其 Request.ContentLength 比设置的大了,所以出错,这是不是实在是太悲剧了啊。这种文件大小限制机制是不是很没有必要啊!
  • 打赏
  • 举报
回复
比如说用户很轻松地把大文件拖到上传组件上,文件如果不符合要求那么应该在0.5秒钟内就提示出来有问题了。如过你的web程序总是在“死机、白屏”5分钟甚至10分钟之后才报告一个异常,用户岂不是要对你的web程序“另眼相看”了嘛。

所以对这类编程设计,不要用跟不上时代潮流的asp.net的编程方式去考虑了,因为现在很多web应用也已经注重用户体验了,你不要再设计出用户体验实在太差的解决方案了。
  • 打赏
  • 举报
回复
从实用角度出发,asp.net没有这个能力。

这需要使用sivlerlight或者ActiveX插件等来实现上传。例如当用户把本地文件用鼠标拖拽到silverlight程序上的时候,silverlight程序就可以立刻检查文件的大小,甚至对文件内容做一些过滤和转换、压缩,然后才开始上传到服务器。由于这些动作在客户端完成,于是可以及时处理。

而假设你等着浏览器使用什么<input type=file />这种东西把大文件传送给服务器的过程中最后才报告“文件太大”,实在是已经太晚了。

  • 打赏
  • 举报
回复
int maxRequestLength = (runTime.MaxRequestLength - 100) * 1024;
这句说明一下,这个配置值是包括页面和上传文件大小的,所以要减去页面大小,这里假设100k。
  • 打赏
  • 举报
回复
不好意思,上面没有说清楚,详细的代码如下:


protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpRuntimeSection runTime = (HttpRuntimeSection)WebConfigurationManager.GetSection("system.web/httpRuntime");
int maxRequestLength = (runTime.MaxRequestLength - 100) * 1024;
HttpContext context = ((HttpApplication)sender).Context;

if (Request.ContentLength > maxRequestLength)
{
IServiceProvider provider = (IServiceProvider)context;
HttpWorkerRequest workerRequest = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));

// Check if body contains data
if (workerRequest.HasEntityBody())
{
// get the total body length
int requestLength = workerRequest.GetTotalEntityBodyLength();
// Get the initial bytes loaded
int initialBytes = 0;
if (workerRequest.GetPreloadedEntityBody() != null)
initialBytes = workerRequest.GetPreloadedEntityBody().Length;
if (!workerRequest.IsEntireEntityBodyIsPreloaded())
{
byte[] buffer = new byte[512000];
// Set the received bytes to initial bytes before start reading
int receivedBytes = initialBytes;
while (requestLength - receivedBytes >= initialBytes)
{
// Read another set of bytes
initialBytes = workerRequest.ReadEntityBody(buffer, buffer.Length);

// Update the received bytes
receivedBytes += initialBytes;
}
initialBytes = workerRequest.ReadEntityBody(buffer, requestLength - receivedBytes);
}
}
}
}

protected void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
if (ex.InnerException != null && ex.InnerException.Message.Contains("Maximum request length exceeded"))
{
Server.ClearError();
Response.Redirect("~/FileTooLarge.aspx");
}

}


asp.net 4.0下调试通过。
需要说明的是,不敢居功,关键的代码和注释来自:参考

不过他的代码有点小错误,就是如果在Application_BeginRequest里redirect会报exception,不过这个很简单,只要在Application_Error里捕获一下,ClearError后再redirect就可以了,我不过做了这点小改动,主要功劳在于Application_BeginRequest里的那段代码。
kankankankan2222 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

要想给出友好的出错信息只有在global.asax.cs里的application_error里捕获异常,解析后给出出错信息。web.config里只能修改上传文件大小的上限,固然可以改得很大,比如1个g,但是超出上限一样会提示页面不存在。
[/Quote]

说的很对。thankyou。
但是global.asax.cs里的application_error里捕获异常该怎么去实现。能给出程序吗。我之前在global.asax里改成
1、可以在用下面的方法在请求前检查一下,将错误扼杀在初期,定向到一个友好的提示界面。

void Application_BeginRequest(object sender, EventArgs e)
{
HttpRuntimeSection section = (HttpRuntimeSection)ConfigurationManager.GetSection("system.web/httpRuntime");
int maxFileSize = section.MaxRequestLength*1024;

if (Request.ContentLength > maxFileSize)
{
Response.Redirect("~/FileTooLarge.aspx");
}
}

但是还是错的。 Response.Redirect("~/FileTooLarge.aspx");出错了
  • 打赏
  • 举报
回复
要想给出友好的出错信息只有在global.asax.cs里的application_error里捕获异常,解析后给出出错信息。web.config里只能修改上传文件大小的上限,固然可以改得很大,比如1个g,但是超出上限一样会提示页面不存在。
色拉油 2012-03-30
  • 打赏
  • 举报
回复
congig中有默认配置,改改就好了
mngzilin 2012-03-30
  • 打赏
  • 举报
回复
超过限制当然不能上传了,否则我循环上传一个超大的文件,你服务器不就瘫痪了么
kankankankan2222 2012-03-30
  • 打赏
  • 举报
回复
config里改了也不是很好。只要config里设置一个超大的数字就不会出异常。但那天有人上传一个比我设的大一点。就又会有这个异常。还是没法避免。总不能设一个无限大的值把。
  • 打赏
  • 举报
回复
在配置文件里配置可上传文件的大小!

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧