2008-11-18 15 views
41

mam ten formularz moim zdaniem:Przesyłanie plików za pomocą ASP.Net MVC - pobierz nazwę, ale bez strumienia pliku, co robię źle?

<!-- 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> 

i ten kod w moim kontrolera:

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(); 
    } 
} 

podstawie każdej próbki kodu udało mi się znaleźć, to wydaje się w drodze do Zrób to. Próbowałem już z małymi i dużymi plikami, bez różnicy w wyniku. Pole formularza zawsze zawiera nazwę pliku, która pasuje do tego, co wybrałem, a kolekcja Request.Files jest zawsze pusta.

Nie sądzę, że jest to istotne, ale używam serwera sieci Web VS Development. AFAIK obsługuje wysyłanie plików tak samo jak IIS.

Robi się późno i jest szansa, że ​​brakuje mi czegoś oczywistego. Byłbym wdzięczny za radę.

+0

odnoszą http://stackoverflow.com/questions/9411563/asp-net-mvc3 -razor-file-upload-gives-zero-as-file-count dla powiązanego problemu – Lijo

Odpowiedz

50

nie wiem jaka polityka jest delegowania wulgaryzmów, ale tutaj jest problem:

enctype="mulitipart/form-data" 

Dodatkowy i tam zatrzymał przesyłanie pliku. Musiał uruchomić Fiddlera, aby zobaczyć, że nigdy nie wysyłał pliku w pierwszej kolejności.

Warto przeczytać:

enctype="multipart/form-data" 
+0

HAHA :) tęskniłem za tym! dobra robota! Może możesz zaktualizować dno początkowego postu, wspominając o rozwiązaniu i oznaczając własną odpowiedź itp. Niezły! –

+0

A może zaktualizować kod, aby ludzie kopiowali - wklejając pierwszy przykład przynajmniej otrzymali właściwy kod. –

+2

Już dwukrotnie miałem ten problem z powodu kopiowania wklejania entype z tego posta! –

2
var file = Request.Files[sFileName]; 

powinny być ...

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

powiedział, że powinno być 1 Request.Files.Count ... hmmm

+0

Zmieniono to i próbowałem ponownie, aby się upewnić, ale bez zmian. Request.Files ["FileBlob"] również zwraca wartość null. Request.Files.Count to nadal 0. Będę jednak edytować próbkę kodu, aby wyjaśnić. –

0

dobrze, że znalazł swój błąd.

Na marginesie warto spróbować/złapać kod obsługi plików, aby wiedzieć, kiedy uprawnienia do plików itp. Nie są poprawnie skonfigurowane.

+0

Właściwie to nie dotykam systemu plików. Plik jest przechowywany w bazie danych. Ale dzięki. –

Powiązane problemy