Максимальная длина загрузки
Вещи, которые я уже знаю об ограничениях размера загрузки в MVC:
- Для IIS7 вы должны установить оба
maxAllowedContentLength
а такжеmaxRequestLength
для максимального размера загрузки - Я знаю, что 1 свойство в байтах, а другое в килобайтах
- Вы можете использовать свойство 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, ...), то сделайте это, чтобы избежать потери пропускной способности.