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


1
आपको बस सार्वजनिक ActionResult Upload (HttpPostedFileBase फ़ाइल) <इनपुट प्रकार = "फ़ाइल" नाम = "FileUpload" />
मुहम्मद असद

बाहर मेरी कार्यान्वयन यहाँ जाँच stackoverflow.com/a/40990080/4251431
बशीर अल MOMANI

2
बाहर लापता enctypeफार्म पर मुझे एक घंटे खर्च
सैवेज

अपलोड () विधि और बटन के बीच संबंध कहां है। वहाँ एक 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संग्रह में कोई फ़ाइल नहीं है तो यह अपवाद नहीं होगा ..?
शशवत

2
वास्तव में यह फेंक देगा ArgumentOutOfRangeException, लेकिन आपका अधिकार सही है, मैंने अपडेट किया
क्रिस्टी पुफू

2
याद रखें कि Html.BeginForm के पैरामीटर एक्शन नाम और कंट्रोलर नाम हैं (बिना 'पोस्टफिक्स' के पोस्टफिक्स के। उदाहरण के लिए: HomeController के बजाय होम)। एक और महत्वपूर्ण बात यह है कि अंदर <form> टैग को शामिल न करें, क्योंकि बिगिनफार्म है जो टैग को खोलता है
pocjoc

5
दूसरे शब्दों में - आपका दृश्य मॉडल गुण नाम इनपुट प्रकार के नाम से मेल खाना चाहिए। यदि आपकी viewmodelसंपत्ति का नाम लिया गया है, AgentPhotoतो आपके पास आपके विचार के अनुसार निम्नलिखित होना चाहिए:<input type="file" name="AgentPhoto"/>
दयान

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 अनुलग्नक {प्राप्त करें; सेट; } / अटैचमेंट एक पहचान नहीं है
कोडोन

मुझे लगता है कि कोला अटैचमेंट प्रकार को परिभाषित नहीं किया जा रहा है।
करसन

2
दृश्य का उपयोग user2028367 द्वारा वर्णित के रूप में किया जा सकता है। वास्तव में मैं Html.BeginForm भाग में नए {enctype = "मल्टीपार्ट / फॉर्म-डेटा"} को शामिल करना भूल गया, इसलिए मेरी कार्रवाई में फ़ाइल को देखने में असमर्थ था। बहुत बढ़िया जवाब। मॉडल वर्ग और विस्तार विधि में दिखाने के लिए +1।
अर्जुन 7

@BishoyHanna मैं अपने फ़ॉर्म पर, अनुलग्नक कैसे डालूं। अन्य मूल्यों के लिए रेजर हमें एक सरल वाक्यविन्यास प्रदान करता है, लेकिन मैं इसे इस फाइल के लिए कैसे करूं?
डेनिस वी

1
hi, @ClintEastwood, वह पोस्ट एक फ़ाइल अपलोड करने के लिए थी, मैंने ऑनलाइन कुछ चीज़ों के लिए खोज की जो कई अपलोड (आपके लिए) से मेल खाती हैं और पाया कि जो मुझे लगता है कि काम करेगा। फिर से, इसका मॉडल आधारित है जो "Request.Files" का उपयोग नहीं कर रहा है। stackoverflow.com/questions/36210413/…
बिश्नोई हन्ना

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 का उपयोग करें। इसके बाद आप आकार, प्रकार आदि का सरल पता लगा सकते हैं।

फ़ाइल गुण आप यहाँ पा सकते हैं:

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.