2009-02-13 47 views
15

Trên các Xem:Uploaded HttpPostedFile là null

<% =Html.BeginForm("About", "Home", FormMethod.Post, new {enctype="multipart/form-data "})%> 
    <input type="file" name="postedFile" /> 
    <input type="submit" name="upload" value="Upload" /> 
<% Html.EndForm(); %> 

Trong Controller, có điều gì đó như thế này:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult About(HttpPostedFile postedFile) 
{ 
    //but postedFile is null 
    View(); 
} 

postedFile là null trong About(). Làm cách nào để tải tệp lên?

+3

chỉ cần lưu ý cho bất kỳ ai gặp phải vấn đề tương tự .. Vấn đề thực tế ở đây là 'enctype =" multipart/form-data "' có một khoảng trống ở cuối giá trị thuộc tính và tin tôi, Firefox sẽ đặt lại nó mã hóa mặc định. Bạn sẽ không nhận thấy nó trong chrome. Tôi đã phải đối mặt với cùng một vấn đề và khi tôi phát hiện và loại bỏ không gian thêm đó, mọi thứ diễn ra tốt đẹp ..! Hy vọng nó sẽ tiết kiệm vài phút của một ai đó ..! –

+1

checkout [Mục nhập blog của Scott Hansleman] (http://www.hanselman.com/blog/ABackToBasicsCaseStudyImplementingHTTPFileUploadWithASPNETMVCIncludingTestsAndMocks.aspx) – Matthew

Trả lời

7

Điều này không trả lời tại sao tham số của bạn là rỗng, nhưng bạn có thể tìm hiểu trực tiếp yêu cầu. Đây có thể không phải là cách "MVC" nhất để làm điều này. thử điều này trong cơ thể phương pháp của bạn:

var upload = Request.Files["postedFile"] 
if (upload.ContentLength > 0) 
{ 
    // Do whatever 
} 

Để được nhiều hơn "MVC," Bạn có thể kéo mã mà ra của bộ điều khiển của bạn thành một thực IModelBinder và sử dụng một đối tượng tùy chỉnh như một tham số để phương pháp của bạn. Điều này Scott Hanselman blog post cho thấy các bước để thực hiện một ModelBinder tùy chỉnh.

1

Tôi cũng nhận được một số kỳ quặc với <%= Html.BeginForm ...%>. Vì vậy, tôi sử dụng việc sử dụng. Một lần nữa, ở phía Controller, tôi chỉ lấy các tập tin đã tải lên của tôi để tạo thành đối tượng yêu cầu.

Hãy thử điều này. Nó hoạt động:

<% using (Html.BeginForm("Post", "Home", FormMethod.Post, new {enctype = "multipart/form-data"})) 
    {%> 

    <input type="file" id="postedFile" name="PostedFile" /> 
    <input type="submit" /> 

<% 
} 

%>

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Post(FormCollection form) 
    { 
     HttpPostedFileBase postedFile = Request.Files["PostedFile"]; 
     return RedirectToAction("Index"); 
    } 
+0

postedFile vẫn là rỗng –

+0

Chỉ cần sao chép và dán hành động điều khiển và chế độ xem của tôi. Nó làm việc cho tôi. Lưu ý rằng phương thức hành động của tôi không dùng tham số HttpPostedFile. –

2

Phiên bản nào của MVC bạn đang sử dụng? Ngay bây giờ với RC ứng cử viên tôi đã thử bằng cách sử dụng HttpPostedFile và tôi đã nhận một "không có một lỗi constructor trống." Tôi đã phải sử dụng HttpPostedFileBase.

Quan trọng hơn, là phiên bản MVC bạn đang chạy, tùy thuộc vào phiên bản, cách bạn truy xuất tệp đã đăng sẽ khác nhau.

27

Sử dụng HttpPostedFileBase (không phải HttpPostedFile) và cũng đặt tên cho thông số chính xác như trong biểu mẫu. ví dụ. nếu bạn có

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

bạn phải có người đứng đầu phương pháp:

public ActionResult About(HttpPostedFileBase file1) 
+0

Và id và tên cần phải giống nhau không? –

+1

thực sự chỉ có tên là bắt buộc (và phải phù hợp với tên tham số phương thức). Id chỉ được sử dụng bởi javascript và css (đơn giản). –

+2

Tôi đã có cùng một vấn đề chính xác và một khi thay đổi kiểu tham số hành động của tôi từ 'HttpPostedFile' thành' HttpPostedFileBase', nó hoạt động. Vì vậy, gợi ý đó nên được nhấn mạnh. –

4

tôi đã cùng một vấn đề:

Bạn phải xác định một tên VÀ id cho các yếu tố đầu vào:

<input type="file" name="postedFile" id="postedFileId" /> 

Trân trọng

Stefan

3

Bạn nên loại bỏ không gian từ cuối enctype thuộc tính:

new {enctype="multipart/form-data "} => new {enctype="multipart/form-data"} 
2

Một không gian trống sau khi "multipart/form-data" là vấn đề thực sự ...

2

bạn đang sử dụng jquery di động?nếu có, bạn sẽ cần phải thiết @data_ajax false

new { enctype = "multipart/form-data", @data_ajax = "false" } 
1

Ngoài ra, tôi đã phát hiện ra rằng việc kê khai hình thức trong đó những lời dối trá tập tin tải lên phải luôn có

new {enctype="multipart/form-data"} 
2

sử dụng này

public ActionResult Upload(HttpPostedFileBase excelfile) 

thay đổi HttpPostedFile cho HttpPostedFileBase

1

Dưới đây là tất cả các bit bạn cần phải uplaod file

//in your model 
public partial class Profile 
{ 
    [DisplayName("Image Upload")] 
    [DataType(DataType.Upload)] 
    public HttpPostedFileBase FileUpload { get; set; } 
} 



// in your view 
@model ProjName.Blabla.Profile 

@using (Html.BeginForm("Edit", "Profile", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <input type="file" name="FileUpload" id="FileUpload" value="Choose File" class="form-control" /> 

    <input type="submit" value="Save" class="btn btn-default" /> 
} 
0
<form id="Form1" method="post" encType="multipart/form-data" runat="server"> 

Thêm encType="multipart/form-data" mẫu của bạn.