Загрузка файла бритвы 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" />
}

Возможный дубликат загрузки файла ASP.NET MVC 3.0
Liam

1
вам просто нужно изменить публичную загрузку ActionResult (файл HttpPostedFileBase) <input type = "file" name = "FileUpload" />
Мухаммед Асад

посмотрите мою реализацию здесь stackoverflow.com/a/40990080/4251431
Башир Аль-Момани

2
Отсутствие в enctypeформе стоило мне часа
Дикарь

Где находится связь между методом Upload () и кнопкой. Должно ли быть событие onClick?
Впервые

Ответы:


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 являются имя действия и имя контроллера (без постфикса 'controller'. Например: Home вместо HomeController). Еще одна важная вещь - не включать тег <form> внутри, потому что это BeginForm, который открывает тег
pocjoc

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

Post Action

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

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

public HttpPostedFileBase attachment {get; устанавливать; } / вложение не является идентификатором
Codeone

Я думаю, что Cola имеет в виду, что тип вложения не определен.
Карсон

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.