2011-12-18 15 views
37

Mam problem podczas przesyłania pliku w środowisku ASP.NET MVC. Moje kodu jest poniżej:HttpPostedFileBase zawsze zwraca wartość null w ASP.NET MVC

Widok:

@{ 
    ViewBag.Title = "Index"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Index2</h2> 
@using (Html.BeginForm("FileUpload", "Board", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <input type="file" /> 
    <input type="submit" /> 
} 

Kontroler:

[HttpPost] 
public ActionResult FileUpload(HttpPostedFileBase uploadFile) 
{ 
    if (uploadFile != null && uploadFile.ContentLength > 0) 
    { 
     string filePath = Path.Combine(Server.MapPath("/Temp"), Path.GetFileName(uploadFile.FileName)); 
     uploadFile.SaveAs(filePath); 
    } 
    return View(); 
} 

Ale uploadFile zawsze zwraca null. Czy ktoś może dowiedzieć się, dlaczego?

Odpowiedz

94
@{ 
    ViewBag.Title = "Index"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Index2</h2> 
@using (Html.BeginForm("FileUpload", "Board", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <input type="file" name="uploadFile"/> 
    <input type="submit" /> 
} 

trzeba dostarczyć nazwę pliku do typu wejścia do uploadFile aby modelować wiążącej pracę w ASP.NET MVC i
również upewnić się, że nazwa pliku typu wejścia i argument nazwy z HttpPostedFileBase jest identyczny.

+0

wow ... dzięki bardzo. Nie miałem pojęcia o tym MVC. Jestem bardzo nowy w ASP.NET MVC. Dzięki. –

+36

Nie przegapiłem nazwy pola, ale miałem taki sam problem "null" z powodu braku parametru enctype w definicji formularza. Dzięki za przykład. – niallsco

+0

@dotnetstep thanks – anpatel

0

Może być też inny scenariusz. W moim przypadku otrzymywałem ten problem, ponieważ bezpośrednio renderowałem znacznik skryptu w moim widoku MVC, a IE podaje tam problem.

Prawidłowy kod w widoku powinny być jak poniżej:

@section scripts 
{ 
    <script> 
     $(document).ready(function() { 
      $('.fileinput').fileinput(); 
... 
} 
6

próbowałem większość rozwiązań umieszczone w Internecie na ten temat, ale okazało się, że lepiej jest użyć obejście zamiast ..

to naprawdę nie miało znaczenia, co zrobiłem HttpPostedFileBase i/lub HttpPostedFile zawsze były puste. Korzystanie z kolekcji HttpContext.Request.Files wydawało się działać bez żadnych kłopotów.

np.

if (HttpContext.Request.Files.AllKeys.Any()) 
     { 
      // Get the uploaded image from the Files collection 
      var httpPostedFile = HttpContext.Request.Files[0]; 

      if (httpPostedFile != null) 
      { 
       // Validate the uploaded image(optional) 

       // Get the complete file path 
       var fileSavePath =(HttpContext.Server.MapPath("~/UploadedFiles") + httpPostedFile.FileName.Substring(httpPostedFile.FileName.LastIndexOf(@"\"))); 

       // Save the uploaded file to "UploadedFiles" folder 
       httpPostedFile.SaveAs(fileSavePath); 
      } 
     } 

W powyższym przykładzie I tylko chwycić pierwszy plik, ale to tylko kwestia zapętlenie chociaż kolekcji, aby zapisać wszystkie pliki.

HTH

Rob

3

W moim scenariuszu problem był z atrybutem id, miałem to:

<input type="file" name="file1" id="file1" /> 

soultion było usunięcie ID:

<input type="file" name="file1" /> 
+3

Damm, w moim przypadku użyłem HttpPostedFile zamiast HttpPostedFileBase .. błąd programisty:/ –

+0

Samuel uratowałeś mój dzień! Chociaż jest to wyjaśnione na http://stackoverflow.com/a/24911221/2346618 Myślę, że jest głupio używać bazowej klasy HttpPostedFileBase w podpisie. W programowaniu zorientowanym obiektowo, klasy bazowe są używane do pomocy w konstruowaniu konkretnych klas i interfejsów do protokołów. Używanie interfejsu takiego jak IHttpPostedFile będzie mniej podatne na błędy IMO. –

Powiązane problemy