【发布时间】:2011-04-30 09:31:47
【问题描述】:
我们想限制我们网站上的最大上传文件大小。我们已经在 web.config 中设置了适当的限制。我们遇到的问题是,如果上传真正大文件(例如 1 GB),整个文件在生成服务器端错误之前上传,并且无论文件是否巨大,错误的类型都不同。
有没有办法在实际上传之前检测待上传文件的大小?
这是我将请求限制为 16 MB 的相关 web.config 设置:
<?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 存在允许上传大文件的错误,尽管有限制,所以我提交了错误 here。
与 HTTP 模块和处理程序相比,ISAPI 扩展是否可以让我对请求处理有更多的控制权,例如允许我在 Content-Length 标头大于允许的限制时中止上传?
更新 2:
叹息。 Microsoft 已经关闭了我作为副本提交的错误,但没有提供其他信息。希望他们不只是在这件事上丢球。
更新 3:
万岁!据微软称:
此错误已被解决,因为它已被移植到 IIS 产品团队。 IIS 团队已经修复了该错误,该错误将包含在未来的 Windows 版本中。
【问题讨论】:
-
+1 关于这个问题;我自己对这个话题很感兴趣。我的理解是,在整个请求进入之前,您无法对它做任何事情,而且您尝试使用的代码当然无法事先知道。我认为在请求管道中需要更早的时间;在客户端,或者在 IIS/ASP.NET 收到请求之前 - 当请求开始流入时。
-
可能你可以参考这个:stackoverflow.com/questions/14032918/…
标签: asp.net iis-7 file-upload httprequest httpmodule