MVC 4 Razor Dosya Yükleme


249

MVC 4'te yeniyim ve web siteme Dosya Yükleme Denetimi'ni uygulamaya çalışıyorum. Hatayı bulamıyorum. Dosyamda boş değer alıyorum.

Denetleyici:

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

Görünüm:

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


1
sadece genel ActionResult Upload (HttpPostedFileBase dosyası) değiştirmelisiniz <input type = "file" name = "FileUpload" />
Muhammad Asad


2
enctypeFormda eksik olan bir saat bana mal oldu
Savage

Upload () yöntemi ile düğme arasındaki bağlantı nerede. Bir onClick etkinliği olmalı mı?
Asp.net'te

Yanıtlar:


333

UploadYöntemin HttpPostedFileBaseparametresi ile aynı ada sahip olmalıdır file input.

Yani girdiyi şu şekilde değiştirin:

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

Ayrıca, dosyaları şurada bulabilirsiniz 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
koleksiyonda Index out of boundsdosya yoksa istisna olmaz Request.Files..?
shashwat

2
Aslında atacak ArgumentOutOfRangeException, ama haklısın, ben güncelledim
Cristi Pufu

2
Html.BeginForm parametrelerinin eylem adı ve denetleyici adı olduğunu unutmayın ('denetleyici' postfix'i olmadan. Örneğin: HomeController yerine Home). Bir diğer önemli şey, içine <form> etiketini eklememektir, çünkü etiketi açan
BeginForm

5
Başka bir deyişle - Görünüm modeli özellik adınız, giriş türü adının adıyla eşleşmelidir. viewmodelMülkünüzün adı varsa, AgentPhotoo zaman görüşünüze göre aşağıdakilere sahip olmalısınız:<input type="file" name="AgentPhoto"/>
Dayan

var path = Path.Combine(Server.MapPath("~/Images/"), fileName);, "Server" sınıfı bulunamadı, hangi paket kullanılıyor?
Danilo Pádua

65

Açıklığa kavuşturmak. Model:

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

İşlem Sonrası

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

Son olarak hasFile dosyasını denetlemek için Extension yöntemi

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

public HttpPostedFileBase eki {get; Ayarlamak; } / bağlanma bir tanımlama değildir
Codeone

Bence Cola, tanımlanmayan Ek türüne atıfta bulunuyor.
Karson

2
Görünüm user2028367 tarafından tarif edildiği gibi kullanılabilir. Aslında Html.BeginForm bölümünde yeni {enctype = "multipart / form-data"} eklemeyi unuttum, bu yüzden eylemimde dosyayı görüntüleyemedi. Mükemmel cevap. Model sınıfında ve Uzantı yönteminde göstermek için +1.
Arjun

@BishoyHanna Formuma eki nasıl eklerim. Diğer değerler için jilet bize basit bir sözdizimi sağlar, ancak bu dosya için nasıl yaparım?
Denis V

1
merhaba, @ClintEastwood, bu gönderi bir dosya yüklemek içindi, çevrimiçi olarak birden fazla yüklemeyle (sizin için) eşleşen bir şey aradım ve çalışacağını düşündüğüm bir dosya buldum. Yine, "Request.Files" kullanmayan modeli stackoverflow.com/questions/36210413/…
Bishoy Hanna

17

Sayfaya bak

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

Komut dosyaları

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

Denetleyicide

    [HttpPost]
    public ActionResult UploadFile(HttpPostedFileBase file)
    {

    }

2
@Muflix'e katılıyorum, AJAXburada ihtiyacınız yok. Html.BeginFormişi zaten yapıyor. AJAX sadece<form action=LINK>
jAC

1
Kullanıcı deneyimini geliştirmenize izin verdiği için Ajax daha büyük dosyalar için daha iyidir.
markthewizard1234

6

parametrede ve ad alanı adında aynı adın gerekli olması nedeniyle girişinizin adını değiştirmeniz yeterlidir, sadece bu satırı değiştirin Kodunuz iyi çalışıyor

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

2

Bence, daha iyi bir yol HttpPostedFileBase kontrol veya API kullanmaktır. Bundan sonra boyutu, türü vb.

Burada bulabileceğiniz dosya özellikleri:

MVC3 HttpPostedFileBase bir görüntü olup olmadığını kontrol etme

Örneğin 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();  
}

Umarım yardımcı olur.


Ne daha iyi? OP zaten kullanıyor HttpPostedFileBase.
jpaugh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.