2011-12-18 59 views
37

Tôi gặp sự cố khi tải lên tệp trong ASP.NET MVC. Mã của tôi là dưới đây:HttpPostedFileBase luôn trả về null trong ASP.NET MVC

Xem:

@{ 
    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" /> 
} 

Bộ điều khiển:

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

Nhưng UploadFile luôn trả về null. Bất cứ ai có thể tìm ra lý do tại sao ??

Trả lời

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" /> 
} 

bạn phải cung cấp tên cho loại đầu vào tập tin để UploadFile để mô hình làm việc ràng buộc trong ASP.net MVC và
cũng chắc chắn rằng tên của loại đầu vào của bạn tập tin và lập luận tên của HttpPostedFileBase giống nhau.

+0

wow ... cảm ơn rất nhiều. Tôi không biết về MVC này. Tôi rất mới với ASP.NET MVC. Cảm ơn. –

+36

Tôi đã không bỏ lỡ tên trường nhưng đã có cùng một vấn đề 'null' do thiếu tham số enctype trong định nghĩa biểu mẫu. Cảm ơn ví dụ. – niallsco

+0

@dotnetstep thanks – anpatel

0

Cũng có thể có một trường hợp khác. Trong trường hợp của tôi, tôi đã nhận được vấn đề này bởi vì tôi đã trực tiếp rendering thẻ script trong chế độ xem MVC của tôi và IE đang đưa ra vấn đề ở đó.

mã đúng theo quan điểm nên càng dưới đây:

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

Tôi đã cố gắng hầu hết các giải pháp được đăng trực tuyến với chủ đề này, nhưng không tìm thấy nó tốt hơn để sử dụng một cách giải quyết thay vì ..

Nó thực sự không quan trọng những gì tôi đã làm HttpPostedFileBase và/hoặc HttpPostedFile luôn luôn là null. Sử dụng bộ sưu tập HttpContext.Request.Files dường như làm việc mà không phức tạp chút nào.

ví dụ:

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

Trong ví dụ trên, tôi chỉ lấy tệp đầu tiên, nhưng nó chỉ là vấn đề lặp lại mặc dù bộ sưu tập lưu tất cả tệp.

HTH

Rob

3

Trong kịch bản của tôi vấn đề là với thuộc tính id, tôi đã này:

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

Các soultion là để loại bỏ id:

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

Damm, trong trường hợp của tôi, tôi đã sử dụng HttpPostedFile thay vì HttpPostedFileBase .. lập trình lỗi:/ –

+0

Samuel bạn đã cứu ngày của tôi! Mặc dù nó được giải thích tại http://stackoverflow.com/a/24911221/2346618 Tôi nghĩ rằng đó là ngớ ngẩn để sử dụng một lớp cơ sở HttpPostedFileBase trong chữ ký. Trong lập trình hướng đối tượng, các lớp cơ sở được sử dụng để giúp xây dựng các lớp và giao diện cụ thể được sử dụng cho các giao thức. Sử dụng một giao diện như IHttpPostedFile sẽ ít bị lỗi IMO hơn. –

Các vấn đề liên quan