最大上传长度

PcP*_*sar 9 c# asp.net-mvc iis-7 file-upload maxrequestlength

我已经知道的有关MVC上传大小限制的事情:

  1. 对于IIS7,你必须同时设置maxAllowedContentLengthmaxRequestLength为最大上传大小
  2. 我知道1个属性以字节为单位,另一个属性以千字节为单位
  3. 您可以使用location属性指定固定位置

我有一个上传组件,应该能够处理多达200MB的文件.我不认为将maxlimit每个页面设置为200MB的权利,所以我想使用动态请求URL作为位置.

上传URL的路由模式如下所示: {dynamicvalue}/ConvertModule/Upload

("ConvertModule"是控制器,"上传"是动作.)困难的部分是{dynamicvalue},因为这个我不能设置一个固定的位置web.config.

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

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

Dar*_*rov 7

问题1:是否有办法仅为给定路由模式设置上传限制?

不是我知道,因为<location>节点不支持动态网址.但你可以通过使用url rewrite模块来欺骗它.

因此,假设您有一个处理文件上传的控制器:

public class PicturesController
{
    [HttpPost]
    public ActionResult Upload(HttpPostedFileBase file, int dynamicValue)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

并且您有一些配置为与此控制器匹配的路由:

routes.MapRoute(
    "Upload",
    "{dynamicvalue}/ConvertModule/Upload",
    new { controller = "Pictures", action = "Upload" },
    new { dynamicvalue = @"^[0-9]+$" }
);
Run Code Online (Sandbox Code Playgroud)

好的,现在让我们在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>
Run Code Online (Sandbox Code Playgroud)

到目前为止很好,现在你可以设置<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>
Run Code Online (Sandbox Code Playgroud)

现在您可以上传到以下模式{dynamicvalue}/ConvertModule/Upload的url :url rewrite模块将重写它,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>
Run Code Online (Sandbox Code Playgroud)

问题2:超过上传大小时是否可以显示自定义警告?

不,您必须将限制设置为更大的值,并在上传处理程序内检查文件大小.如果您可以检查客户端上的文件大小(HTML5,Flash,Silverlight,...),那么这样做是为了避免浪费带宽.