Tải lên tập tin dao động MVC 4


249

Tôi chưa quen với MVC 4 và tôi đang cố gắng thực hiện Kiểm soát tải lên tệp trong trang web của mình. Tôi không thể tìm thấy lỗi. Tôi đang nhận được một giá trị null trong tệp của mình.

Điều khiển:

public class UploadController : BaseController
    {
        public ActionResult UploadDocument()
        {
            return View();
        }

       [HttpPost]
       public ActionResult Upload(HttpPostedFileBase file)
       {
           if (file != null && file.ContentLength > 0)
           {
               var fileName = Path.GetFileName(file.FileName);
               var path = Path.Combine(Server.MapPath("~/Images/"), fileName);
               file.SaveAs(path);
           }

           return RedirectToAction("UploadDocument");
        }
    }

Lượt xem:

@using (Html.BeginForm("Upload", "Upload", FormMethod.Post, new { enctype = "multipart/form-data" }))
{ 
    <input type="file" name="FileUpload" />
    <input type="submit" name="Submit" id="Submit" value="Upload" />
}

có thể trùng lặp với Tải lên tệp ASP.NET MVC 3.0
Liam

1
bạn chỉ cần thay đổi Tải lên ActionResult công khai (tệp httpPostedFileBase) <input type = "file" name = "FileUpload" />
Muhammad Asad

kiểm tra Thực hiện của tôi ở đây stackoverflow.com/a/40990080/4251431
Basheer AL-MOMANI

2
Bỏ lỡ enctypemẫu đơn khiến tôi mất một giờ
Savage

Đâu là kết nối giữa phương thức Upload () và nút. Có nên có một sự kiện onClick? Mới tham gia asp.net Tôi là
pnizzle

Câu trả lời:


333

Các Uploadphương pháp của HttpPostedFileBasetham số phải có tên giống như các file input.

Vì vậy, chỉ cần thay đổi đầu vào này:

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

Ngoài ra, bạn có thể tìm thấy các tập tin trong Request.Files:

[HttpPost]
public ActionResult Upload()
{
     if (Request.Files.Count > 0)
     {
         var file = Request.Files[0];

         if (file != null && file.ContentLength > 0)
         {
            var fileName = Path.GetFileName(file.FileName);
            var path = Path.Combine(Server.MapPath("~/Images/"), fileName);
            file.SaveAs(path);
         }
     }

     return RedirectToAction("UploadDocument");
 }

2
Sẽ không thông qua Index out of boundsngoại lệ trong trường hợp không có tập tin trong Request.Filesbộ sưu tập ..?
shashwat

2
Trên thực tế nó sẽ ném ArgumentOutOfRangeException, nhưng bạn nói đúng, tôi đã cập nhật
Cristi Pufu

2
Hãy nhớ rằng các tham số của Html.BeginForm là tên hành động và tên của trình điều khiển (không có hậu tố 'trình điều khiển'. Ví dụ: Home thay vì HomeContoder). Một điều quan trọng khác là không bao gồm thẻ <form> bên trong, bởi vì BeginForm mở thẻ
pocjoc

5
Nói cách khác - Tên thuộc tính mô hình xem của bạn phải khớp với tên của loại đầu vào. Nếu viewmodeltài sản của bạn được đặt tên AgentPhotothì bạn phải có những điều sau đây về quan điểm của bạn:<input type="file" name="AgentPhoto"/>
Dayan

var path = Path.Combine(Server.MapPath("~/Images/"), fileName);, không tìm thấy lớp "Máy chủ", sử dụng gói nào?
Danilo Pádua

65

Làm rõ nó Mô hình:

public class ContactUsModel
{
    public string FirstName { get; set; }             
    public string LastName { get; set; }              
    public string Email { get; set; }                 
    public string Phone { get; set; }                 
    public HttpPostedFileBase attachment { get; set; }

Đăng hành động

public virtual ActionResult ContactUs(ContactUsModel Model)
{
 if (Model.attachment.HasFile())
 {
   //save the file

   //Send it as an attachment 
    Attachment messageAttachment = new Attachment(Model.attachment.InputStream,       Model.attachment.FileName);
  }
}

Cuối cùng, phương thức mở rộng để kiểm tra hasFile

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace AtlanticCMS.Web.Common
{
     public static class ExtensionMethods 
     {
         public static bool HasFile(this HttpPostedFileBase file)
         {
             return file != null && file.ContentLength > 0;
         }        
     }
 }

công khai tệp đính kèm httpPostedFileBase {get; bộ; } / tệp đính kèm không phải là nhận dạng
Codeone

Tôi nghĩ rằng Cola đang đề cập đến loại Đính kèm không được xác định.
Karson

2
Chế độ xem có thể được sử dụng theo mô tả của user2028367. Trên thực tế, tôi đã quên bao gồm {enctype = "Multipart / form-data"} trong phần Html.BeginForm, vì vậy không thể xem tệp trong hành động của tôi. Câu trả lời chính xác. +1 để hiển thị trong lớp Model và phương thức mở rộng.
Arjun

@BishoyHanna Làm thế nào tôi đặt, trên hình thức của tôi, các tập tin đính kèm. Đối với các giá trị khác, dao cạo cung cấp cho chúng tôi một cú pháp đơn giản, nhưng tôi làm thế nào cho tệp này?
Denis V

1
xin chào, @ClintEastwood, bài đăng đó là để tải lên một tệp, tôi đã tìm kiếm trực tuyến một cái gì đó phù hợp với nhiều lượt tải lên (cho bạn) và thấy rằng một cái mà tôi nghĩ sẽ hoạt động. Một lần nữa, mô hình dựa trên mô hình không sử dụng stackoverflow
Flow

17

Xem trang

@using (Html.BeginForm("ActionmethodName", "ControllerName", FormMethod.Post, new { id = "formid" }))
 { 
   <input type="file" name="file" />
   <input type="submit" value="Upload" class="save" id="btnid" />
 }

tập kịch bản

$(document).on("click", "#btnid", function (event) {
        event.preventDefault();
        var fileOptions = {
            success: res,
            dataType: "json"
        }
        $("#formid").ajaxSubmit(fileOptions);
    });

Trong bộ điều khiển

    [HttpPost]
    public ActionResult UploadFile(HttpPostedFileBase file)
    {

    }

2
Tôi đồng ý với @Muflix, bạn không cần AJAXở đây. Html.BeginFormđã làm công việc này rồi AJAX chỉ cần thiết nếu bạn không muốn chuyển hướng đến<form action=LINK>
jAC

1
Ajax tốt hơn cho các tệp lớn hơn vì nó cho phép bạn nâng cao trải nghiệm người dùng.
markthewizard1234

6

bạn chỉ cần thay đổi tên của đầu vào của mình được nộp vì cùng tên được yêu cầu trong tham số và tên trường nhập chỉ cần thay thế dòng này Mã của bạn hoạt động tốt

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

2

Tôi nghĩ, cách tốt hơn là sử dụng HttpPostedFileBase trong bộ điều khiển hoặc API của bạn. Sau này, bạn có thể đơn giản phát hiện kích thước, loại vv

Thuộc tính tệp bạn có thể tìm thấy ở đây:

MVC3 Cách kiểm tra xem httpPostedFileBase có phải là hình ảnh không

Ví dụ: ImageApi:

[HttpPost]
[Route("api/image")]  
public ActionResult Index(HttpPostedFileBase file)  
{  
    if (file != null && file.ContentLength > 0)  
        try 
        {  
            string path = Path.Combine(Server.MapPath("~/Images"),  
               Path.GetFileName(file.FileName));

            file.SaveAs(path);  
            ViewBag.Message = "Your message for success";  
        }  
        catch (Exception ex)  
        {  
            ViewBag.Message = "ERROR:" + ex.Message.ToString();  
        }  
    else 
    {  
        ViewBag.Message = "Please select file";  
    }  
    return View();  
}

Hy vọng nó sẽ giúp.


Tốt hơn cái gì? OP đã sử dụng HttpPostedFileBase.
jpaugh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.