web-dev-qa-db-fra.com

MVC 4 Razor File Upload

Je suis nouveau sur MVC 4 et j'essaie d'implémenter le contrôle de téléchargement de fichier sur mon site Web. Je ne parviens pas à trouver l'erreur. J'obtiens une valeur nulle dans mon fichier.

Manette:

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

Vue:

@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" />
}
237
user2028367

Le paramètre Upload de la méthode HttpPostedFileBase doit avoir le même nom que le file input.

Alors changez simplement l'entrée en ceci:

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

En outre, vous pouvez trouver les fichiers dans 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");
 }
312
Cristi Pufu

En le clarifiant. Modèle:

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

Enfin la méthode d'extension pour vérifier le 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;
         }        
     }
 }
63
Bishoy Hanna

Voir page

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

fichier de script

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

Dans le contrôleur

    [HttpPost]
    public ActionResult UploadFile(HttpPostedFileBase file)
    {

    }
18
Jagadisha B S

il vous suffit de changer le nom de votre champ de saisie car le même nom est requis dans le paramètre et le nom du champ de saisie remplace simplement cette ligne Votre code fonctionne bien

 <input type="file" name="file" />
6
Hafiz Asad

Je pense, meilleure façon est d'utiliser HttpPostedFileBase dans votre contrôleur ou API. Ensuite, vous pouvez simplement détecter la taille, le type, etc.

Les propriétés de fichier que vous pouvez trouver ici:

MVC3 Comment vérifier si HttpPostedFileBase est une image

Par exemple, 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();  
}

J'espère que ça vous aidera.

2
Petr Tomášek