10

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

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

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

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

(“ConvertModule”是控制器,“Upload”是动作。)困难的部分是{dynamicvalue},因此我无法在web.config.

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

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

1 回答 1

6

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

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

所以让我们假设你有一个控制器处理文件上传:

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的 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>

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

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

于 2012-09-20T08:53:38.823 回答