最大上传长度

时间:2012-09-20 07:58:49

标签: c# asp.net-mvc file-upload iis-7 maxrequestlength

我已经了解MVC上传大小限制的事项:

  1. 对于IIS7,您必须同时设置maxAllowedContentLengthmaxRequestLength以获取最大上传大小
  2. 我知道1个属性以字节为单位,另一个属性以千字节为单位
  3. 您可以使用location属性指定固定位置
  4. 我有一个上传组件,最多可以处理200MB文件。我不认为将每个页面的maxlimit设置为200MB是正确的,因此我想将动态请求URL用作位置。

    上传网址的路由模式如下:{dynamicvalue}/ConvertModule/Upload

    (“ConvertModule”是控制器,“上传”是操作。)困难部分是{dynamicvalue},因此我无法在web.config中设置固定位置。

    由于会话劫持,我不想使用Flash上​​传或类似的东西作为解决方案。

    • 问题1 (对我来说最重要):有没有办法只为给定路由模式设置上传限制?
    • 问题2 :超出上传大小时是否可以显示自定义警告?

1 个答案:

答案 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,...),那么这样做是为了避免浪费带宽。