2016-04-06 3 views
1

Ich habe eine Datei Upload-Seite, die auf Knopf klicken Ich rufe eine Methode, wo ich die maximale Größe zu 5   MB zu definieren. Aber wenn ich mehr als das hochlade, wird die Größenfehlermeldung nicht angezeigt. Hier ist mein Code:Fehlermeldung nicht angezeigt, wenn Dateigröße mehr als 5 MB ist

public ActionResult document(HttpPostedFileBase file, Document model) 
{ 
    tbldocument doc = new tbldocument(); 
    //Document model = new Document(); 
    doc.DocumentName = model.documentname; 

    if (ModelState.IsValid) 
    { 
     if (file == null) 
     { 
      ModelState.AddModelError("File", "Please Upload Your file"); 
     } 
     else if (file.ContentLength > 0) 
     { 
      int MaxContentLength = 1024 * 1024 * 10; //10 MB 
      string[] AllowedFileExtensions = new string[] { ".jpg", ".gif", ".png", ".pdf", ".docx", ".doc", ".xml", ".odt", ".xlsx", ".ppt" }; 

      if (!AllowedFileExtensions.Contains(file.FileName.Substring(file.FileName.LastIndexOf('.')))) 
      { 
       ModelState.AddModelError("File", "Please file of type: " + string.Join(", ", AllowedFileExtensions)); 
      } 

      else if (file.ContentLength > MaxContentLength) 
      { 
       ModelState.AddModelError("File", "Your file is too large, maximum allowed size is: " + MaxContentLength + " MB"); 
      } 
      else 
      { 
       var fileName = Path.GetFileName(file.FileName); 
       var path = Server.MapPath("~/App_Data/uploads/documents/" + model.projectid + ""); 
       //var pathFile = path + fileName; 
       if (!Directory.Exists(path)) 
       { 
        Directory.CreateDirectory(path); 
       } 
       var pathWithfileName = Path.Combine(path, fileName); 
       file.SaveAs(pathWithfileName); 
       ModelState.Clear(); 
       tbldocument objdb = new tbldocument(); 
       objdb.DocumentName = model.documentname; 
       objdb.ProjectId = model.projectid; 
       objdb.Path = model.path; 
       objdb.Path = Convert.ToString(pathWithfileName); 
       // objdb.FileName = file.FileName; 
       //objdb.FileName = file.FileName; 
       objdoc.upload(objdb); 
       //" + projectid + " 
       ViewBag.Message = "File uploaded successfully. File path : ~/Upload/" + fileName; 
      } 
     } 
    } 
    return RedirectToAction("ProjectTask", "TblTask"); 
} 

Hier ist der Snap enter image description here. Anstatt die Nachricht an den Benutzer zeigt, dass die Datei kleiner als 5   MB sein muss, wirft es einen Fehler wie:

Enter image description here

+1

Danke für Edit @Stephen Mücke –

+0

Ist diese Methode mit '[HttpPost]' markiert? Und nirgendwo in deinem Code gibst du jemals die Ansicht zurück (deine gerechte Weiterleitung), also ist das Hinzufügen von 'ModelSateError'- und' ViewBag'-Eigenschaften ein wenig sinnlos. –

+1

Dann sollte ich stattdessen ein Modell oder eine Datei zurückgeben? Ich umadressieren, weil wenn Benutzer auf Upload klicken ich umleiten, um Dokumentliste oder Projektliste nicht auf der gleichen Seite –

Antwort

0

Da der Upload in IIS RAM gespeichert wird, bis die Datei vollständig hochgeladen, IIS Wenn die Datei zu groß ist, bevor sie Ihre Methode aufruft, Wenn Sie große Dateien hochgeladen möchten, um so etwas zu web.config hinzufügen:

<system.webServer> 
    <security> 
     <requestFiltering> 
      <requestLimits maxAllowedContentLength="104857600" /><!-- bytes --> 
     </requestFiltering> 
    </security> 
</system.webServer> 

Und wenn Sie diese „nicht behandelte“ Fehler mehr elegant zu handhaben möchten, fügen Sie ein Application_Error Methode in global.asax. cs.

+0

Kann @robrich Sie im Detail erklären? –

+0

Welcher Teil verwirrte dich? – robrich

+0

Ich habe Ihren Code in webconfig aber gleichen Fehler –

0

Sie könnten in ASP.NET das Standardanforderungslimit ausführen, das ist: 4 MB (docs).

Von: http://www.strathweb.com/2012/09/dealing-with-large-files-in-asp-net-web-api/

Zusätzlich ASP.NET-Laufzeit seine eigene Dateigrößenbeschränkung hat (die auch von IIS 6 verwendet wurde, so dass, wenn Sie diese Version verwenden, das ist der einzige Ort, Sie müssen ändern) - befindet sich unter dem httpRuntime-Element der web.config.

Standardmäßig ist es auf 4MB (4096kB) eingestellt. Sie müssen sich ändern, dass auch (in kB nicht in Bytes wie die vorherigen Set!):

<system.web> 
    <httpRuntime maxRequestLength="2097152" /> 
</system.web> 

Es ist daran zu erinnern, dass aus den beiden Konfigurationselementen, je nachdem, was Anfrage Längengrenze kleiner ist, wird Vorrang haben.

Weitere gegeben, dass Sie Ihre Anwendung Host innerhalb IIS 7 oder höher, sollten Sie auch die maxAllowedContentLength einstellen erinnern auch (diese Einstellung von IIS verwendet wird). Der Standardwert hierfür ist 30000000 Bytes (~ 28,6 MB) (docs).

Ich kann Sie ermutigen, einen Blick auf: http://www.strathweb.com/2012/09/dealing-with-large-files-in-asp-net-web-api/ - dieser Artikel behandelt, wie mit großen Dateien in ASP.NET arbeiten, sehr gut.

+1

didn 't bekommen Sie, Sir, können Sie @Lasse Christiansen Sagen Sie mir, was genau ich tun kann? –

+0

' ...' ist für IIS 7+. Wenn Sie nicht auf Win XP oder Server 2003 arbeiten, wird Ihnen diese Lösung wahrscheinlich nicht mehr helfen. – robrich

+0

@robrich Danke für Ihren Kommentar :) Ich habe mich gefragt, ob Sie eine Dokumentation haben, die besagt, dass "httpRuntime" für IIS 6 und nach unten ist? Wie ich es verstehe, hat IIS 7+ eine eigene Einstellung ('maxAllowedContentLength'), während ASP.NET immer noch' maxRequestLength' verwendet? Der Unterschied ist, wie ich es verstehe, dass IIS 6 die gleiche Einstellung wie ASP.NET verwendet. Ich könnte jedoch falsch liegen :) –