Максимальная длина загрузки

Вещи, которые я уже знаю об ограничениях размера загрузки в MVC:

  1. Для IIS7 вы должны установить оба maxAllowedContentLength а также maxRequestLength для максимального размера загрузки
  2. Я знаю, что 1 свойство в байтах, а другое в килобайтах
  3. Вы можете использовать свойство location для указания фиксированного местоположения

У меня есть компонент загрузки, который должен обрабатывать до 200 МБ файлов. Я не думаю, что это право устанавливать maxlimit для каждой страницы до 200 МБ, поэтому я хочу использовать URL-адрес динамического запроса в качестве местоположения.

Шаблон маршрутизации для загружаемого URL выглядит примерно так: {dynamicvalue}/ConvertModule/Upload

("ConvertModule" - это контроллер, а "Upload" - действие.) Сложная часть {dynamicvalue}из-за этого я не могу установить фиксированное местоположение в web.config,

Я не хочу использовать флэш-загрузки или что-то подобное в качестве решения из-за перехвата сессии.

  • Вопрос 1 (самый важный для меня): есть ли способ установить предел загрузки только для данного шаблона маршрутизации?
  • Вопрос 2: возможно ли показывать пользовательское предупреждение при превышении размера загрузки?

1 ответ

Решение

Вопрос 1: Есть ли способ установить лимит загрузки только для данного шаблона маршрутизации?

Не то, чтобы я знал, потому что <location> узел не поддерживает динамические URL. Но вы можете обмануть его, используя модуль перезаписи URL.

Итак, давайте предположим, что у вас есть контроллер, обрабатывающий загрузку файлов:

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>

Теперь вы можете загрузить на URL следующий шаблон: {dynamicvalue}/ConvertModule/Upload и модуль перезаписи URL будет переписать его 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, ...), то сделайте это, чтобы избежать потери пропускной способности.

Другие вопросы по тегам