我们想限制我们网站上的最大上传文件大小.我们已经在web.config中设置了相应的限制.我们遇到的问题是,如果上传了一个非常大的文件(例如1 GB),则在生成服务器端错误之前,将上传整个文件,并且错误的类型是不同的文件是巨大的还是不.
以下是我将相关的web.config设置限制为16 MB的请求:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.web> <httpRuntime maxRequestLength="12288"/> </system.web> <system.webServer> <security> <requestFiltering> <requestLimits maxAllowedContentLength="12582912"/> </requestFiltering> </security> </system.webServer> </configuration>
我已经尝试创建一个HTTP模块,所以我可以在请求生命周期早期拦截一个请求,但上传似乎发生在HttpApplication的BeginRequest事件之前:
public class UploadModule : IHttpModule { private const int MaxUploadSize = 12582912; public void Init(HttpApplication context) { context.BeginRequest += handleBeginRequest; } public void Dispose() { } private void handleBeginRequest(object sender,EventArgs e) { // The upload takes place before this method gets called. var app = sender as HttpApplication; if (app.Request.Files.OfType<HttpPostedFile>() .Any(f => f.ContentLength > MaxUploadSize)) { app.Response.StatusCode = 413; app.Response.StatusDescription = "Request Entity Too Large"; app.Response.End(); app.CompleteRequest(); } } }
更新:
我知道像Flash这样的客户端技术可以在上传之前检测文件大小,但是我们需要一个服务器端解决方法,因为我们希望定位不支持Flash / Java / ActiveX / Silverlight的平台.我相信IIS或ASP.NET有一个错误,允许大文件上传,尽管有限制,所以我提交了一个bug here.
ISAPI扩展可以帮助我比HTTP模块和处理程序更多地控制请求处理,例如,如果Content-Length头被认为大于允许的限制,允许我中止上传?
更新2:
叹. Microsoft已经关闭了我作为重复提交的错误,但没有提供任何其他信息.他们希望他们不要放弃球.
更新3:
万岁!据微软称:
This bug is being resolved as it has been ported over to the IIS product team. The IIS team has since fixed the bug,which will be included in future release of Windows.
解决方法
问题是上传使用HTTP Post请求立即发生,因此您只能在完成后才能检测到.
如果你想要更多的控制,你应该尝试基于Flash的上传小部件有这个和更多.查看这个链接http://www.ajaxline.com/10-most-interesting-upload-widgets