我已经了解MVC上传大小限制的事项:
maxAllowedContentLength
和maxRequestLength
以获取最大上传大小我有一个上传组件,最多可以处理200MB文件。我不认为将每个页面的maxlimit
设置为200MB是正确的,因此我想将动态请求URL用作位置。
上传网址的路由模式如下:{dynamicvalue}/ConvertModule/Upload
(“ConvertModule”是控制器,“上传”是操作。)困难部分是{dynamicvalue}
,因此我无法在web.config
中设置固定位置。
由于会话劫持,我不想使用Flash上传或类似的东西作为解决方案。
答案 0 :(得分:7)
问题1 :有没有办法只为给定路由模式设置上传限制?
并非我知道,因为<location>
节点不支持动态网址。但是你可以使用url rewrite module来欺骗它。
因此,我们假设您有一个处理文件上传的控制器:
public class PicturesController
{
[HttpPost]
public ActionResult Upload(HttpPostedFileBase file, int dynamicValue)
{
...
}
}
并且您已将某些路由配置为与此控制器匹配:
routes.MapRoute(
"Upload",
"{dynamicvalue}/ConvertModule/Upload",
new { controller = "Pictures", action = "Upload" },
new { dynamicvalue = @"^[0-9]+$" }
);
好的,现在让我们在web.config中设置以下重写规则:
<system.webServer>
<rewrite>
<rules>
<clear />
<rule name="rewrite the file upload path" enabled="true">
<match url="^([0-9]+)/ConvertModule/Upload$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
<action type="Rewrite" url="pictures/upload?dynamicvalue={R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
到目前为止一切顺利,现在您可以将<location>
设置为pictures/upload
:
<location path="pictures/upload">
<system.web>
<!-- Limit to 200MB -->
<httpRuntime maxRequestLength="204800" />
</system.web>
<system.webServer>
<security>
<requestFiltering>
<!-- Limit to 200MB -->
<requestLimits maxAllowedContentLength="209715200" />
</requestFiltering>
</security>
</system.webServer>
</location>
现在您可以上传到以下模式的网址:{dynamicvalue}/ConvertModule/Upload
,网址重写模块会将其重写为pictures/upload?dynamicvalue={dynamicvalue}
,但<location>
标记将与pictures/upload
匹配,成功应用限制:
<form action="/123/ConvertModule/Upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<button type="submit">OK</button>
</form>
问题2:超出上传大小时是否可以显示自定义警告?
不,您必须将限制设置为更大的值,并在上传处理程序内检查文件大小。如果您可以检查客户端上的文件大小(HTML5,Flash,Silverlight,...),那么这样做是为了避免浪费带宽。