MVC 4 면도기 파일 업로드


249

MVC 4를 처음 사용하고 있으며 웹 사이트에서 파일 업로드 컨트롤을 구현하려고합니다. 실수를 찾을 수 없습니다. 파일에 null 값이 있습니다.

제어 장치:

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


1
공개 ActionResult Upload (HttpPostedFileBase 파일) <input type = "file"name = "FileUpload"/>를 변경하면됩니다.
Muhammad Asad

여기 내 구현을 확인하십시오. stackoverflow.com/a/40990080/4251431
Basheer AL-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, 그러나 당신의 말이 맞아요, 업데이트
Cristi Pufu

2
Html.BeginForm의 매개 변수는 작업 이름과 컨트롤러 이름입니다 (예 : 'Controller'접미사 없음 (예 : HomeController 대신 Home)). 또 다른 중요한 점은 <form> 태그를 포함하지 않는 것입니다. 태그를 여는 BeginForm
pocjoc

5
다시 말해-뷰 모델 속성 이름은 입력 유형 이름과 일치해야합니다. 귀하의 viewmodel부동산 이름이 AgentPhoto다음과 <input type="file" name="AgentPhoto"/>
같을 경우

var path = Path.Combine(Server.MapPath("~/Images/"), fileName);, "서버"클래스를 찾을 수 없습니다. 어떤 패키지를 사용합니까?
Danilo Pádua

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

Cola가 첨부 파일 유형이 정의되지 않았다고 말합니다.
Karson

2
user2028367에서 설명한대로보기를 사용할 수 있습니다. 실제로 Html.BeginForm 부분에 새로운 {enctype = "multipart / form-data"}를 포함하는 것을 잊었으므로 내 작업에서 파일을 볼 수 없었습니다. 좋은 대답입니다. 모델 클래스 및 확장 메소드에 표시하려면 +1
Arjun

@BishoyHanna 양식에 첨부 파일을 넣는 방법. 다른 값의 경우 면도기는 간단한 구문을 제공하지만이 파일에 대해 어떻게 수행합니까?
Denis 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();  
}

도움이 되길 바랍니다.


무엇보다 낫습니까? OP에서 이미 사용 중 HttpPostedFileBase입니다.
jpaugh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.