2012-09-20 6 views
9

Le cose che già si conosce limiti di dimensione di upload in MVC:max Carica lunghezza

  1. Per IIS7 si devono impostare sia maxAllowedContentLength e maxRequestLength per una dimensione massima di upload
  2. so 1 struttura si trova in byte e la altri in kilobyte
  3. È possibile utilizzare la proprietà posizione per specificare una posizione fissa

ho un componente di upload, che dovrebbe essere in grado di gestire fino a 200 MB di file. Non penso sia giusto impostare lo maxlimit per ogni singola pagina su 200 MB, quindi desidero utilizzare l'URL della richiesta dinamica come posizione.

Il modello di routing per l'URL di upload è qualcosa di simile: {dynamicvalue}/ConvertModule/Upload

("ConvertModule" è il controller e "Carica" ​​è l'azione.) La parte difficile è {dynamicvalue}, a causa di questo i cant impostare un posizione fissa in web.config.

Non voglio utilizzare caricamenti flash o qualcosa del genere come soluzione a causa del dirottamento di sessione.

  • Domanda 1 (più importante per me): C'è un modo per impostare il limite di upload per la concessione di routing unico modello?
  • Domanda 2: È possibile visualizzare un avviso personalizzato quando è stata superata la dimensione di caricamento?
+1

Hai due domande; potresti volerli postare separatamente per la migliore risposta. In risposta a Q2: il server darà una risposta di errore quando viene superata la dimensione del caricamento; se lo desideri puoi visualizzare una pagina di errore specifica per quella risposta nella tua applicazione. –

+0

Ricordarsi di cambiare il tempo di caricamento nel web.config. Come base penso che sia impostato su un file di 2 MB – Oedum

risposta

6

Domanda 1: C'è un modo per impostare il limite di upload solo per il modello di routing dando?

Non che io sappia perché il nodo <location> non supporta gli URL dinamici. Ma potresti imbrogliare usando lo url rewrite module.

Quindi cerchiamo di supporre che si dispone di una gestione del controller upload di file:

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

e che avete qualche itinerario configurato in modo che corrisponda a questo controller:

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

OK, ora cerchiamo di impostare le seguenti riscrivi la regola nel 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> 

Fin qui tutto bene, ora è possibile impostare il <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> 

Ora si può caricare su un URL del seguente schema: {dynamicvalue}/ConvertModule/Upload e il modulo URL Rewrite riscriverà al pictures/upload?dynamicvalue={dynamicvalue} ma il tag <location> corrisponderà pictures/upload e applicare con successo il limite:

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

Domanda 2: È possibile visualizzare un avviso personalizzato quando è stata superata la dimensione di caricamento?

No, sarà necessario impostare il limite su un valore maggiore e all'interno del gestore di upload controllare le dimensioni del file. E se riesci a controllare le dimensioni del file sul client (HTML5, Flash, Silverlight, ...), fallo per evitare di sprecare larghezza di banda.

+0

Grazie per questa risposta! Contiene una risposta a tutti i problemi in cui mi sono imbattuto. – PcPulsar