2010-12-06 25 views
2

Ich erstellte MVC-Projekt und möchte die Datei hochladen. Ich habe mich registriert in der web.configmvc Dateiupload mit httpRuntime maxRequestLength

<httpRuntime maxRequestLength="2000"/> 
<customErrors mode="On" redirectMode="ResponseRedirect" defaultRedirect="address here"> </ customErrors>, in Index.aspx <% using (Html.BeginForm ("upload", "home", FormMethod.Post, 
    new {enctype = "multipart/form-data"})) {%> 
    <label for="file"> Filename: </ label> 
    <input type="file" name="file" id="file" /> 

    <input type="submit" /> 
<%}%> 

In HomeController.cs

[HttpPost] 
public ActionResult Upload (HttpPostedFileBase file) 
{ 
    if (file! = null & & file.ContentLength> 0) 
    { 
     if (file.ContentLength> 4096000) 
     { 
      return RedirectToAction ("FileTooBig"); 
     } 
     var fileName = Path.GetFileName (file.FileName); 
     var path = Path.Combine (Server.MapPath ("~/App_Data/uploads"), fileName); 
     file.SaveAs (path); 
    } 
    return RedirectToAction ("Index"); 
} 

Wenn ich Dateien anhängen mehr als 2 Megabyte DefaultRedirect perfekt in Opera funktioniert, funktioniert aber nicht in Chrome und IE. Ich habe auch Response.Redirect ("Adresse hier") im Application_Error() Ereignis in global.asax verwendet. Es funktioniert auch nicht in Chrome und IE. Was soll ich machen?

Antwort

1

maxRequestLength ist in Kilobyte (KB). Sie haben Ihre auf 2000 KB eingestellt (was etwas weniger als 2 MB ist, da 1024 KB in 1 MB sind).

Ich bin mir nicht sicher, warum es in einigen Browsern und nicht anderen funktioniert, es sei denn, einige komprimieren den gesamten Upload-Inhalt und andere nicht (was ich glaube, dass von HTTP 1.1 unterstützt wird).

HTH, Brian

1

Versuchen Sie dies. Dieses Snippet wurde getestet und funktionierte wie erwartet. Versuchen Sie in Zukunft, den var-Typ für die String-Variable nicht zu verwenden. var ist ein dynamischer Typ und sollte für alle Dateitypen funktionieren - einschließlich Array. Aber versuchen Sie, mit Dateityp spezifisch zu sein, um Fehler zu reduzieren.

Normalerweise halte ich meine öffentlichen Dateien im Öffentlichen Ordner. So ändern Sie es in Ihrem Ordner (zB App_Data)

[HttpPost] 
public ActionResult test(HttpPostedFileBase file) 
{ 
    if (file.ContentLength> 4096000) 
     { 
      return RedirectToAction ("FileTooBig"); 
     } 

    string fileName = Path.GetFileName(file.FileName); 
    string uploadPath = Server.MapPath("~/Public/uploads/" + fileName); 

    file.SaveAs(uploadPath); 
    return View("Index"); 
} 

Viel Glück

+0

Ich muss die Dateigröße vor dem Hochladen überprüfen. Ich kann das im Application_BeginRequest in Global.asax tun, aber wie kann ich die Download-Datei abbrechen, wenn die Größe größer ist als meine Variable maxFileSize? Wenn ich Redirect in diesem Ereignis verwende, wird die Datei zuerst geladen und funktioniert dann Redirect. – Stwr

+0

Sie können eine Datei ohne http-Anfrage nicht überprüfen. Beachten Sie, dass [httpPost] über der actionresult-Methode eine submit-Eingabe benötigt. Nach dem Senden wartet die httpPostFileBase auf die Verarbeitung. Jetzt können Sie Ihre Logik verwenden, um mit der Datei zu tun, was Sie wollen. – Jack

+0

Ich kann die Dateigröße vor dem Hochladen in das Application_BeginRequest() - Ereignis überprüfen, BEVOR die Datei hochgeladen wird. Wenn ich [HttpPost] public ActionResult functionName() verwende, wird die Datei vollständig hochgeladen und dann kann ich die Dateigröße überprüfen. Die zweite Option ist schlecht für dieses Projekt. Aber ich weiß nicht, wie man die Download-Datei abbricht, wenn die Größe größer ist als meine Variable maxFileSize (erste Option). – Stwr

0

Dann versuchen Sie mit dem if-die-anderen. Dieser Ausschnitt funktioniert. Wenn es Ihnen gefällt, stimmen Sie mich ab.

[HttpPost] 
public ActionResult test(HttpPostedFileBase file) 
{ 
    if (file.ContentLength > 400) 
    { 
     return RedirectToAction("GeneralError", "Error"); 
    } 
    else 
    { 
     string fileName = Path.GetFileName(file.FileName); 
     string uploadPath = Server.MapPath("~/Public/uploads/" + fileName); 

     file.SaveAs(uploadPath); 
     return View("Index"); 
    } 
} 

zwei Eingabetasten benötigt: die Datei für das Surfen: die Datei für die Vorlage:

Good Luck!

1

Es gibt keine Möglichkeit zu verhindern, dass die Datei hochgeladen wird. IIS empfängt den gesamten HTTP-Anforderungshauptteil, bevor er an den ASP.NET-Stapel übergeben wird. Dies umfasst alle Teile Ihres mehrteiligen Formulars. Aus diesem Grund hat ASP.NET wirklich keine Möglichkeit, eine Datei durch das Überprüfen der file.ContentLength-Eigenschaft zu unterbrechen.

Sie können ein benutzerdefiniertes HTTP-Modul schreiben, um die Dateigröße zu überprüfen, aber das Abbrechen oder Schließen der Antwort vor dem Empfang der gesamten Anfrage führt zu einer leeren Antwort. Das heißt, es gibt keine Möglichkeit, elegant zu versagen.

Mein Vorschlag wäre, tun Sie Ihre Datei hochladen in einem versteckten iframe während der Implementierung des HTTP-Moduls. Wenn etwas schief geht, wird Ihre Hauptseite nicht brechen.

Jeder kann mich bei dem Dank an Microsoft für dieses großartige "Feature" (Warteschlange im Sarkasmus) danken.

Danke Microsoft. Vielen Dank.

+0

Nicht sicher, ob Sie eine Lösung oder einen Workaround dafür gefunden haben. Aber haben Sie herausgefunden, dass Sie die Dateiübertragung nicht abbrechen können? Es ist einfach nicht möglich mit IIS. –

Verwandte Themen