2012-09-20 31 views
9

cosas que ya sé sobre los límites de tamaño de subida en MVC:carga máxima longitud

  1. Para IIS7 que tienen que establecer tanto maxAllowedContentLength y maxRequestLength para un tamaño de carga máximo
  2. sé 1 propiedad está en bytes y el otra en kilobytes
  3. puede utilizar la propiedad de ubicación para especificar una ubicación fija

tengo un componente de carga que debe ser capaz de manejar archivos de hasta 200 MB. No creo que sea correcto establecer el maxlimit para cada página en 200MB, por lo que quiero utilizar la URL de solicitud dinámica como ubicación.

El patrón de enrutamiento para la dirección URL de carga es algo como esto: {dynamicvalue}/ConvertModule/Upload

("ConvertModule" es el controlador y "Subir" es la acción.) La parte difícil es {dynamicvalue}, debido a esto i cant fijo una ubicación fija en web.config.

No quiero usar cargas flash o algo así como una solución debido al secuestro de la sesión.

  • Pregunta 1 (lo más importante para mí): ¿Hay una manera de establecer el límite de carga para la entrega único patrón de enrutamiento?
  • Pregunta 2: ¿Es posible mostrar una advertencia personalizada cuando se excede el tamaño de carga?
+1

Tiene dos preguntas; Es posible que desee publicarlos por separado para una mejor respuesta. En respuesta a Q2: el servidor dará una respuesta de error cuando se exceda el tamaño de carga; puede mostrar una página de error específica para esa respuesta en su aplicación si lo desea. –

+0

Recuerde cambiar el tiempo de carga en el archivo web.config. Como básico, creo que está configurado en un archivo de 2 MB – Oedum

Respuesta

6

Pregunta 1: ¿Hay una manera de establecer el límite de carga de sólo el patrón de enrutamiento dar?

No estoy al tanto porque el nodo <location> no admite las URL dinámicas. Pero puedes engañarlo usando el url rewrite module.

Así que vamos a suponer que usted tiene un manejo controlador de carga de archivos:

public class PicturesController 
{ 
    [HttpPost] 
    public ActionResult Upload(HttpPostedFileBase file, int dynamicValue) 
    { 
     ... 
    } 
} 

y que tiene alguna ruta configurada para que coincida con este controlador:

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

bien, ahora vamos a configurar la siguiente reescribir la regla en la 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> 

Hasta aquí todo bien, ahora se podría configurar el <location> a 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> 

Ahora se podía subir a una dirección URL de la siguiente distribución: {dynamicvalue}/ConvertModule/Upload y el módulo de reescritura de URL volverá a escribir a pictures/upload?dynamicvalue={dynamicvalue} pero la etiqueta <location> coincidirá pictures/upload y aplicar con éxito el límite:

<form action="/123/ConvertModule/Upload" method="post" enctype="multipart/form-data"> 
    <input type="file" name="file" /> 
    <button type="submit">OK</button> 
</form> 

Pregunta 2: ¿Es posible mostrar un aviso personalizado cuando se excede el tamaño de carga?

No, tendrá que establecer el límite en un valor mayor y dentro de su controlador de carga verificar el tamaño del archivo. Y si puede verificar el tamaño del archivo en el cliente (HTML5, Flash, Silverlight, ...), hágalo para evitar el desperdicio de ancho de banda.

+0

¡Gracias por esta respuesta! Contiene una respuesta para todos los problemas con los que me encontré. – PcPulsar

Cuestiones relacionadas