Завантаження файлу MVC 4 із бритвою


249

Я новачок у MVC 4 і намагаюся впровадити контроль завантаження файлів на своєму веб-сайті. Я не в змозі знайти помилку. Я отримую нульове значення у своєму файлі.

Контролер:

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

Вид:

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

можливий дублікат File Upload ASP.NET MVC 3.0
Liam

1
вам просто потрібно змінити загальнодоступний файл ActionResult Upload (HttpPostedFileBase файл) <input type = "file" name = "FileUpload" />
Muhammad Asad

перевірити моє Здійснення тут stackoverflow.com/a/40990080/4251431
Башир Аль-MOMANI

2
Зникнення enctypeна бланку коштувало мені години
Savage

Де знаходиться зв’язок між методом Upload () та кнопкою. Чи має відбутися подія onClick? Нове для asp.net Я
pnizzle

Відповіді:


333

Параметр Uploadметоду HttpPostedFileBaseповинен мати те саме ім'я, що і file input.

Тому просто змініть вхід до цього:

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

Також файли ви можете знайти в 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
чи не буде це Index out of boundsвиключенням, якщо в Request.Filesколекції немає файлу ..?
shashwat

2
Насправді це ArgumentOutOfRangeException
кинеться

2
Пам'ятайте, що параметри Html.BeginForm - це ім'я дії та ім'я контролера (без поштового коду "контролер". Наприклад: Home замість HomeController). Ще одна важлива річ - не включати тег <form> всередину, тому що тег
BeginForm

5
Іншими словами - Назва властивості моделі перегляду має відповідати імені вхідного типу. Якщо ваше viewmodelмайно названо, AgentPhotoто у вас повинно бути таке:<input type="file" name="AgentPhoto"/>
Dayan

var path = Path.Combine(Server.MapPath("~/Images/"), fileName);, клас "Сервер" не знайдено, який пакет використання?
Данило Падуа

65

Уточнюючи це. Модель:

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

Опублікувати дію

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

Нарешті метод розширення для перевірки 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;
         }        
     }
 }

публічне вкладення HttpPostedFileBase {get; набір; } / вкладення не ідентифікує
Codeone

Я думаю, що Кола посилається на те, що тип вкладення не визначається.
Карсон

2
Перегляд можна використовувати, як описано користувачем2028367. Насправді я забув включити новий {enctype = "multipart / form-data"} у частину Html.BeginForm, тому не зміг переглянути файл у моїй дії. Чудова відповідь. +1 для показу в класі моделі та методі розширення.
Арджун

@BishoyHanna Як я помістив на своїй формі додаток. Для інших значень бритва надає нам простий синтаксис, але як це зробити для цього файлу?
Денис V

1
привіт, @ClintEastwood, ця публікація була для завантаження одного файлу, я шукав в Інтернеті те, що відповідає декільком завантаженням (для тебе) і знайшов той, який, на мою думку, спрацює. Знову ж , його модель , заснована , яка не використовує «Request.Files» stackoverflow.com/questions/36210413 / ...
Bishoy Hanna

17

Переглянути сторінку

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

файл сценарію

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

У контролері

    [HttpPost]
    public ActionResult UploadFile(HttpPostedFileBase file)
    {

    }

2
Я згоден з @Muflix, вам тут не потрібно AJAX. Html.BeginFormробить роботу вже. AJAX потрібен лише у тому випадку, якщо ви не хочете переспрямувати на<form action=LINK>
jAC

1
Ajax краще для великих файлів, оскільки він дозволяє покращити користувацький досвід.
markthewizard1234

6

Вам просто потрібно змінити ім'я поданого Вами вводу, оскільки те саме ім'я потрібне в параметрі, а ім'я поля введення просто замініть цей рядок. Ваш код працює нормально

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

2

Я думаю, кращим способом є використання HttpPostedFileBase у своєму контролері чи API. Після цього ви можете просто визначити розмір, тип тощо.

Властивості файлів ви можете знайти тут:

MVC3 Як перевірити, чи HttpPostedFileBase є зображенням

Наприклад 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();  
}

Сподіваюся, це допоможе.


Краще за що? ОП вже використовується HttpPostedFileBase.
jpaugh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.