2008-11-18 3 views
41

Ich habe dieses Formular aus meiner Sicht:Hochladen von Dateien mit ASP.Net MVC - Name, aber kein Dateistream, was mache ich falsch?

<!-- Bug (extra 'i') right here-----------v --> 
<!-- was: <form method="post" enctype="mulitipart/form-data" action="/Task/SaveFile"> --> 
<form method="post" enctype="multipart/form-data" action="/Task/SaveFile"> 
<input type="file" id="FileBlob" name="FileBlob"/> 
<input type="submit" value="Save"/> 
<input type="button" value="Cancel" onclick="window.location.href='/'" /> 
</form> 

Und diesen Code in meinem Controller:

public ActionResult SaveFile(FormCollection forms) 
{ 
    bool errors = false; 
    //this field is never empty, it contains the selected filename 
    if (string.IsNullOrEmpty(forms["FileBlob"])) 
    { 
     errors = true; 
     ModelState.AddModelError("FileBlob", "Please upload a file"); 
    } 
    else 
    { 
     string sFileName = forms["FileBlob"]; 
     var file = Request.Files["FileBlob"]; 
     //'file' is always null, and Request.Files.Count is always 0 ??? 
     if (file != null) 
     { 
     byte[] buf = new byte[file.ContentLength]; 
     file.InputStream.Read(buf, 0, file.ContentLength); 
     //do stuff with the bytes 
     } 
     else 
     { 
     errors = true; 
     ModelState.AddModelError("FileBlob", "Please upload a file"); 
     } 
    } 
    if (errors) 
    { 
     return ShowTheFormAgainResult(); 
    } 
    else 
    { 
     return View(); 
    } 
} 

Basierend auf jedem Codebeispiel habe ich fündig geworden zu sein, das ist wie die Art und Weise scheint TU es. Ich habe es mit kleinen und großen Dateien versucht, ohne Unterschied im Ergebnis. Das Formularfeld enthält immer den Dateinamen, der dem entspricht, was ich gewählt habe, und die Sammlung Request.Files ist immer leer.

Ich glaube nicht, dass es relevant ist, aber ich verwende den VS Development Web Server. AFAIK unterstützt Datei-Uploads genauso wie IIS.

Es wird spät und es gibt eine Chance, dass mir etwas offensichtlich fehlt. Ich wäre dankbar für jeden Rat.

+0

Siehe http://stackoverflow.com/questions/9411563/asp-net-mvc3 -razor-file-upload-gives-zero-as-file-count für ein verwandtes Problem – Lijo

Antwort

50

Ich weiß nicht, was die Politik Profanität auf Entsendung ist, aber hier ist die Problem:

enctype="mulitipart/form-data" 

die zusätzliche i in gestoppt dort die Datei aus hochladen. Musste Fiddler laufen lassen, um zu sehen, dass es die Datei nie gesendet hat.

Es sollte lauten:

enctype="multipart/form-data" 
+0

HAHA :) das habe ich verpasst! gute Arbeit! Vielleicht kannst du den Anfang deines ersten Posts aktualisieren, indem du die Lösung nennst und deine eigene Antwort markierst, etc., netter! –

+0

Oder vielleicht den Code aktualisieren, so dass die Leute kopieren das erste Beispiel kopieren mindestens den richtigen Code. –

+2

Ich hatte dieses Problem bereits zweimal, weil ich den Enctype aus diesem Post kopiert habe! –

2
var file = Request.Files[sFileName]; 

sollte ...

var file = Request.Files["FileBlob"]; 

, auf dem stand Request.Files.Count 1 sein sollte ... hmmm

+0

Geändert und erneut versucht, sicher zu sein, aber keine Änderung. Request.Files ["FileBlob"] gibt auch null zurück. Request.Files.Count ist immer noch 0. Ich werde das Codebeispiel zur Klärung bearbeiten. –

0

Gut, dass Sie Ihren Fehler gefunden.

Als eine Nebenbemerkung möchten Sie einen Versuch/catch um den Dateiverarbeitungscode, damit Sie wissen, wenn Dateiberechtigungen usw. nicht richtig eingerichtet sind.

+0

Eigentlich berühre ich das Dateisystem nicht. Die Datei wird in einer Datenbank gespeichert. Aber danke. –