การอัปโหลดไฟล์ 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" />
}

มีความเป็นไปได้ที่ซ้ำกันของการอัปโหลดไฟล์ ASP.NET MVC 3.0
Liam

1
คุณเพียงแค่ต้องเปลี่ยนการอัพโหลดสาธารณะ ActionResult (ไฟล์ HttpPostedFileBase) <input type = "file" name = "FileUpload" />
Muhammad Asad

ตรวจสอบการใช้งานของฉันที่นี่stackoverflow.com/a/40990080/4251431
Basheer AL-MOMANI

2
การพลาดenctypeแบบฟอร์มเสียค่าใช้จ่ายฉันชั่วโมง
Savage

การเชื่อมต่อระหว่างวิธีอัพโหลด () และปุ่มอยู่ที่ไหน ควรมีเหตุการณ์ onClick หรือไม่ ใหม่ไปที่ asp.net ฉัน
pnizzle

คำตอบ:


333

Uploadวิธีการของพารามิเตอร์จะต้องมีชื่อเดียวกับที่HttpPostedFileBasefile 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 เป็นชื่อการดำเนินการและชื่อตัวควบคุม (โดยไม่ต้องมี postfix 'controller' ตัวอย่างเช่น: Home แทน HomeController) อีกสิ่งที่สำคัญคือการไม่รวมแท็ก <form> ภายในเพราะเป็น BeginForm ที่เปิดแท็ก
pocjoc

5
กล่าวอีกนัยหนึ่ง - ชื่อคุณสมบัติโมเดลมุมมองของคุณจะต้องตรงกับชื่อประเภทอินพุต หากviewmodelสถานที่ให้บริการของคุณมีชื่อAgentPhotoแล้วคุณจะต้องมีต่อไปนี้ในมุมมองของคุณ:<input type="file" name="AgentPhoto"/>
Dayan

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 สิ่งที่แนบมา {รับ; ตั้ง; } / ไฟล์แนบไม่ใช่รหัส
Codeone

ฉันคิดว่าโคล่ากำลังอ้างถึงประเภทไฟล์แนบที่ไม่ได้กำหนดไว้
Karson

2
สามารถใช้มุมมองได้ตามที่อธิบายไว้โดย user2028367 ที่จริงฉันลืมใส่ {enctype = "multipart / form-data"} ใหม่ในส่วน Html.BeginForm ดังนั้นจึงไม่สามารถดูไฟล์ในการกระทำของฉันได้ คำตอบที่ดี +1 สำหรับการแสดงในรุ่นชั้นเรียนและวิธีการขยาย
Arjun

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

หวังว่ามันจะช่วย


ดีกว่าอะไร OP กำลังใช้งานHttpPostedFileBaseอยู่
jpaugh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.