Hochladen der MVC 4 Razor-Datei

249

Ich bin neu in MVC 4 und versuche, File Upload Control auf meiner Website zu implementieren. Ich kann den Fehler nicht finden. Ich erhalte einen Nullwert in meiner Datei.

Regler:

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

Aussicht:

@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" />
}
Liam
quelle
Mögliches Duplikat von Datei-Upload ASP.NET MVC 3.0
Liam
1
Sie müssen nur den öffentlichen ActionResult-Upload (HttpPostedFileBase-Datei) ändern. <input type = "file" name = "FileUpload" />
Muhammad Asad
Schauen
Basheer AL-MOMANI
2
Das Auslassen enctypedes Formulars hat mich eine Stunde gekostet
Savage
Wo ist die Verbindung zwischen der Upload () -Methode und der Schaltfläche? Sollte es ein onClick-Ereignis geben? Neu bei asp.net bin ich
pnizzle

Antworten:

333

Der Parameter der UploadMethode HttpPostedFileBasemuss denselben Namen haben wie der file input.

Ändern Sie einfach die Eingabe in Folgendes:

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

Sie können die Dateien auch finden in 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");
 }
Cristi Pufu
quelle
2
Wird es nicht durch eine Index out of boundsAusnahme, falls sich keine Datei in der Request.FilesSammlung befindet?
Shashwat
2
Eigentlich wird es werfen ArgumentOutOfRangeException, aber Sie haben Recht, ich habe aktualisiert
Cristi Pufu
2
Denken Sie daran, dass die Parameter von Html.BeginForm der Aktionsname und der Controllername sind (ohne den Postfix 'Controller'. Zum Beispiel: Home anstelle von HomeController). Eine andere wichtige Sache ist, das <form> -Tag nicht in das Tag aufzunehmen, da es sich um das BeginForm handelt, das das Tag öffnet
pocjoc
5
Mit anderen Worten - Der Name Ihrer Ansichtsmodelleigenschaft muss mit dem Namen des Eingabetyps übereinstimmen. Wenn Ihre viewmodelImmobilie benannt AgentPhotoist, müssen Sie Folgendes in Ihrer Ansicht haben:<input type="file" name="AgentPhoto"/>
Dayan
var path = Path.Combine(Server.MapPath("~/Images/"), fileName);, die Klasse "Server" nicht gefunden, welches Paket verwendet?
Danilo Pádua
65

Klarstellung. Modell:

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

Schließlich die Erweiterungsmethode zum Überprüfen der 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;
         }        
     }
 }
Bishoy Hanna
quelle
öffentlicher HttpPostedFileBase-Anhang {get; einstellen; } / Anhang ist keine Identifizierung
Codeone
Ich denke, Cola bezieht sich auf den nicht definierten Anhangstyp.
Karson
2
Die Ansicht kann wie von user2028367 beschrieben verwendet werden. Eigentlich habe ich vergessen, new {enctype = "multipart / form-data"} in den Teil Html.BeginForm aufzunehmen, konnte also die Datei in meiner Aktion nicht anzeigen. Gute Antwort. +1 für die Anzeige in der Modellklasse und der Erweiterungsmethode.
Arjun
@BishoyHanna Wie ich den Anhang auf mein Formular setze. Für die anderen Werte bietet uns Rasiermesser eine einfache Syntax, aber wie mache ich das für diese Datei?
Denis V
1
Hallo, @ClintEastwood, dieser Beitrag war für das Hochladen einer Datei gedacht. Ich habe online nach etwas gesucht, das mit mehreren Uploads (für Sie) übereinstimmt, und das gefunden, von dem ich denke, dass es funktionieren würde. Wieder sein Modell basiert, das nicht "Request.Files" stackoverflow.com/questions/36210413/… verwendet
Bishoy Hanna
17

Seite anzeigen

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

Skriptdatei

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

Im Controller

    [HttpPost]
    public ActionResult UploadFile(HttpPostedFileBase file)
    {

    }
Jagadisha BS
quelle
2
Ich stimme @Muflix zu, das brauchst du AJAXhier nicht. Html.BeginFormmacht den Job schon. AJAX wird nur benötigt, wenn Sie keine Weiterleitung zum<form action=LINK>
jAC
1
Ajax ist besser für größere Dateien geeignet, da Sie damit die Benutzererfahrung verbessern können.
markthewizard1234
6

Sie müssen nur den Namen Ihrer Eingabedatei ändern, da für Parameter und Eingabefeldname derselbe Name erforderlich ist. Ersetzen Sie einfach diese Zeile. Ihr Code funktioniert einwandfrei

 <input type="file" name="file" />
Muhammad Asad
quelle
2

Ich denke, der bessere Weg ist die Verwendung von HttpPostedFileBase in Ihrem Controller oder Ihrer API. Danach können Sie einfach Größe, Typ usw. erkennen.

Dateieigenschaften finden Sie hier:

MVC3 So überprüfen Sie, ob HttpPostedFileBase ein Image ist

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

Hoffe es hilft.

Petr Tomášek
quelle
Besser als was? Das OP verwendet bereits HttpPostedFileBase.
Jpaugh