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

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

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

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

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

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

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

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

person PcPulsar    schedule 20.09.2012    source источник
comment
У вас есть два вопроса; вы можете опубликовать их отдельно для лучшего ответа. В ответ на Q2: сервер выдаст сообщение об ошибке при превышении размера загрузки; вы можете отобразить конкретную страницу ошибки для этого ответа в своем приложении, если хотите.   -  person Dan Puzey    schedule 20.09.2012
comment
Не забудьте изменить время загрузки в файле web.config. В качестве основного я думаю, что он установлен на файл размером 2 МБ.   -  person Oedum    schedule 20.09.2012


Ответы (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, ...), то сделайте это, чтобы не тратить пропускную способность.

person Darin Dimitrov    schedule 20.09.2012
comment
Спасибо за этот ответ! Он содержит ответы на все вопросы, с которыми я столкнулся. - person PcPulsar; 20.09.2012