Upload File Razor MVC 4

249

Saya baru mengenal MVC 4 dan saya mencoba menerapkan Kontrol Unggah File di situs web saya. Saya tidak dapat menemukan kesalahan. Saya mendapatkan nilai nol di file saya.

Pengendali:

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

Melihat:

@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" />
}
Liam
sumber
kemungkinan duplikat dari File Upload ASP.NET MVC 3.0
Liam
1
Anda hanya perlu mengubah Upload ActionResult publik (file HttpPostedFileBase) <input type = "file" name = "FileUpload" />
Muhammad Asad
lihat Implementasi saya di sini stackoverflow.com/a/40990080/4251431
Basheer AL-MOMANI
2
Kehilangan enctypeformulir pada saya biaya satu jam
Savage
Di mana ada hubungan antara metode Upload () dan tombol. Haruskah ada acara onClick? Baru di asp.net Saya
pnizzle

Jawaban:

333

The UploadMetode ini HttpPostedFileBaseparameter harus memiliki nama yang sama dengan yang file input.

Jadi ubah saja input ini:

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

Anda juga dapat menemukan file di 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");
 }
Cristi Pufu
sumber
2
bukankah akan melalui Index out of boundspengecualian jika tidak ada file dalam Request.Fileskoleksi ..?
shashwat
2
Sebenarnya itu akan melempar ArgumentOutOfRangeException, tetapi Anda benar, saya memperbarui
Cristi Pufu
2
Ingat bahwa parameter dari Html.BeginForm adalah nama tindakan dan nama pengontrol (tanpa postfix 'controller'. Misalnya: Home alih-alih HomeController). Hal penting lainnya adalah untuk tidak memasukkan tag <form> di dalamnya, karena BeginForm yang membuka tag
pocjoc
5
Dengan kata lain - Nama properti model tampilan Anda harus cocok dengan nama jenis input. Jika viewmodelproperti Anda bernama AgentPhotomaka Anda harus memiliki yang berikut ini pada pandangan Anda:<input type="file" name="AgentPhoto"/>
Dayan
var path = Path.Combine(Server.MapPath("~/Images/"), fileName);, kelas "Server" tidak ditemukan, paket mana yang digunakan?
Danilo Pádua
65

Mengklarifikasi itu. 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; }

Pasca Aksi

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

Akhirnya metode Extension untuk memeriksa 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;
         }        
     }
 }
Bishoy Hanna
sumber
lampiran HttpPostedFileBase publik {get; set; } / lampiran bukan identitas
Codeone
Saya pikir Cola mengacu pada jenis Lampiran yang tidak didefinisikan.
Karson
2
Lihat dapat digunakan seperti yang dijelaskan oleh user2028367. Sebenarnya saya lupa menyertakan {enctype = "multipart / form-data"} baru di bagian Html.BeginForm, jadi tidak dapat melihat file dalam tindakan saya. Jawaban yang bagus +1 untuk ditampilkan dalam kelas Model dan metode Extension.
Arjun
@BishoyHanna Bagaimana saya meletakkan, pada formulir saya, lampiran. Untuk nilai lain, silet memberikan kepada kami sebuah sintaksis sederhana, tetapi bagaimana saya melakukannya untuk file ini?
Denis V
1
hai, @ClintEastwood, posting itu untuk mengunggah satu file, saya mencari sesuatu yang cocok dengan banyak unggahan (untuk Anda) secara daring dan menemukan bahwa yang menurut saya akan berfungsi. Sekali lagi, modelnya berbasis yang tidak menggunakan "Request.Files" stackoverflow.com/questions/36210413/…
Bishoy Hanna
17

Lihat Halaman

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

file skrip

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

Di Kontroler

    [HttpPost]
    public ActionResult UploadFile(HttpPostedFileBase file)
    {

    }
Jagadisha BS
sumber
2
Saya setuju dengan @Muflix, Anda tidak perlu di AJAXsini. Html.BeginFormsudah melakukan pekerjaan. AJAX hanya diperlukan jika Anda tidak ingin pengalihan ke<form action=LINK>
jAC
1
Ajax lebih baik untuk file yang lebih besar karena memungkinkan Anda untuk meningkatkan pengalaman pengguna.
markthewizard1234
6

Anda hanya perlu mengubah nama input yang Anda masukkan karena nama yang sama diperlukan dalam parameter dan nama bidang input cukup ganti baris ini Kode Anda berfungsi dengan baik

 <input type="file" name="file" />
Muhammad Asad
sumber
2

Saya pikir, cara yang lebih baik adalah menggunakan HttpPostedFileBase di controller atau API Anda. Setelah ini, Anda dapat dengan mudah mendeteksi ukuran, jenis, dll.

Properti file dapat Anda temukan di sini:

MVC3 Cara memeriksa apakah HttpPostedFileBase adalah gambar

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

Semoga ini bisa membantu.

Petr Tomášek
sumber
Lebih baik dari apa? OP sudah menggunakan HttpPostedFileBase.
jpaugh