86 votes

Comment télécharger une image/afficher une image dans Asp.Net MVC 4 ?

Quelqu'un connaît-il des tutoriels pas à pas sur la façon de télécharger/afficher une image à partir d'une base de données en utilisant Entity Framework ? J'ai vérifié les extraits de code mais je ne sais toujours pas comment cela fonctionne. Je n'ai pas de code car à part écrire un formulaire de téléchargement, je suis perdu.

Toute aide, et je dis bien toute aide, est grandement appréciée.

D'ailleurs, pourquoi aucun livre ne traite-t-il de ce sujet ? J'ai Pro ASP MVC 4 et professional MVC4 et ils n'en font pas mention.

6 votes

Si vous suivez Pro ASP MVC 4 le site SportsStore Tutorial couvre cette question à partir du page 292

0 votes

Tu as raison. Je n'avais même pas remarqué. Je cherchais un chapitre à ce sujet. Merci

2 votes

Je sais que c'est pour MVC 4, mais cette question apparaîtra quand même si vous cherchez pour MVC 5 - J'ai trouvé un excellent tutoriel qui couvre à la fois le téléchargement vers une base de données et le téléchargement vers un serveur de fichiers dans Mvc 5 en utilisant EF 6 sur MikesDotNetting. mikesdotnetting.com/article/259/

144voto

DotNet Dreamer Points 2512

Jetez un coup d'œil à mon article sur le téléchargement de l'image ou vous pouvez utiliser le même code décrit ci-dessous ;
votre code de vue ;

@using (Html.BeginForm("FileUpload", "Home", FormMethod.Post, 
                            new { enctype = "multipart/form-data" }))
{  
    <label for="file">Upload Image:</label> 
    <input type="file" name="file" id="file" style="width: 100%;" /> 
    <input type="submit" value="Upload" class="submit" /> 
}

votre contrôleur devrait avoir une méthode d'action qui accepterait HttpPostedFileBase ;

 public ActionResult FileUpload(HttpPostedFileBase file)
    {
        if (file != null)
        {
            string pic = System.IO.Path.GetFileName(file.FileName);
            string path = System.IO.Path.Combine(
                                   Server.MapPath("~/images/profile"), pic); 
            // file is uploaded
            file.SaveAs(path);

            // save the image path path to the database or you can send image 
            // directly to database
            // in-case if you want to store byte[] ie. for DB
            using (MemoryStream ms = new MemoryStream()) 
            {
                 file.InputStream.CopyTo(ms);
                 byte[] array = ms.GetBuffer();
            }

        }
        // after successfully uploading redirect the user
        return RedirectToAction("actionname", "controller name");
    }

Toutefois, si vous voulez en savoir plus... essayez cet article ; http://www.codeproject.com/Articles/442515/Uploading-and-returning-files-in-ASP-NET-MVC

Mise à jour 1

Si vous voulez télécharger des fichiers en utilisant jQuery de manière asynchrone, essayez cet article.

http://hayageek.com/jquery-multiple-file-upload/

le code pour gérer le côté serveur (pour le téléchargement multiple) est ;

 try
    {
        HttpFileCollection hfc = HttpContext.Current.Request.Files;
        string path = "/content/files/contact/";

        for (int i = 0; i < hfc.Count; i++)
        {
            HttpPostedFile hpf = hfc[i];
            if (hpf.ContentLength > 0)
            {
                string fileName = "";
                if (Request.Browser.Browser == "IE")
                {
                    fileName = Path.GetFileName(hpf.FileName);
                }
                else
                {
                    fileName = hpf.FileName;
                }
                string fullPathWithFileName = path + fileName;
                hpf.SaveAs(Server.MapPath(fullPathWithFileName));
            }
        }

    }
    catch (Exception ex)
    {
        throw ex;
    }

ce contrôle renvoie également le nom de l'image (dans un appel javascript) que vous pouvez utiliser pour afficher l'image dans le DOM.

MISE À JOUR 2

Vous pouvez également essayer Téléchargements de fichiers asynchrones en MVC 4 ;

http://weblogs.asp.net/bryansampica/archive/2013/01/15/AsyncMVCFileUpload.aspx

0 votes

Ouah. Merci. Je vais l'essayer. Y a-t-il des ressources, auxquelles vous pensez, que je peux lire pour approfondir mes connaissances sur ce sujet ? Je n'arrive pas à trouver quoi que ce soit.

1 votes

Après avoir fait file.SaveAs(path) comment puis-je alors supprimer le fichier de ce chemin ?

0 votes

L'utilisation d'angularjs pour envoyer un fichier html de type image au côté serveur est plus facile, stackoverflow.com/a/26409100/900284

46voto

Voici un court tutoriel :

Modèle :

namespace ImageUploadApp.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Image
    {
        public int ID { get; set; }
        public string ImagePath { get; set; }
    }
}

Voir :

  1. Créer :

    @model ImageUploadApp.Models.Image
    @{
        ViewBag.Title = "Create";
    }
    <h2>Create</h2>
    @using (Html.BeginForm("Create", "Image", null, FormMethod.Post, 
                                  new { enctype = "multipart/form-data" })) {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)
        <fieldset>
            <legend>Image</legend>
            <div class="editor-label">
                @Html.LabelFor(model => model.ImagePath)
            </div>
            <div class="editor-field">
                <input id="ImagePath" title="Upload a product image" 
                                      type="file" name="file" />
            </div>
            <p><input type="submit" value="Create" /></p>
        </fieldset>
    }
    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>
    @section Scripts {
        @Scripts.Render("~/bundles/jqueryval")
    }
  2. Index (pour l'affichage) :

    @model IEnumerable<ImageUploadApp.Models.Image>
    
    @{
        ViewBag.Title = "Index";
    }
    
    <h2>Index</h2>
    
    <p>
        @Html.ActionLink("Create New", "Create")
    </p>
    <table>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.ImagePath)
            </th>
        </tr>
    
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.ImagePath)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
                @Html.ActionLink("Details", "Details", new { id=item.ID }) |
                @Ajax.ActionLink("Delete", "Delete", new {id = item.ID} })
            </td>
        </tr>
    }
    
    </table>
  3. Contrôleur (Créer)

    public ActionResult Create(Image img, HttpPostedFileBase file)
    {
        if (ModelState.IsValid)
        {
            if (file != null)
            {
                file.SaveAs(HttpContext.Server.MapPath("~/Images/") 
                                                      + file.FileName);
                img.ImagePath = file.FileName;
            }  
            db.Image.Add(img);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(img);
    }

J'espère que cela vous aidera :)

0 votes

Wow, merci beaucoup pour ça. Et si je voulais restreindre l'image à jpeg ?

0 votes

@KalaJ Si vous voulez restreindre les images téléchargées à seulement jpg vous pouvez ajouter l'attribut accept (Html5 ne fonctionne que dans Chrome et FF pas IE). Ou vous pouvez vérifier l'extension dans le contrôleur filename.LastIndexOf(".") quelque chose comme ça. J'espère que cela vous aidera

0 votes

@JordyvanEijk, j'ai utilisé l'attribut accept mais il ne fonctionne que dans Chrome. Il ne fonctionne pas dans FF ou IE. J'ai besoin d'une autre forme de validation.

-16voto

user3789888 Points 9
        <input type="file" id="picfile" name="picf" />
       <input type="text" id="txtName" style="width: 144px;" />
 $("#btncatsave").click(function () {
var Name = $("#txtName").val();
var formData = new FormData();
var totalFiles = document.getElementById("picfile").files.length;

                    var file = document.getElementById("picfile").files[0];
                    formData.append("FileUpload", file);
                    formData.append("Name", Name);

$.ajax({
                    type: "POST",
                    url: '/Category_Subcategory/Save_Category',
                    data: formData,
                    dataType: 'json',
                    contentType: false,
                    processData: false,
                    success: function (msg) {

                                 alert(msg);

                    },
                    error: function (error) {
                        alert("errror");
                    }
                });

});

 [HttpPost]
    public ActionResult Save_Category()
    {
      string Name=Request.Form[1]; 
      if (Request.Files.Count > 0)
        {
            HttpPostedFileBase file = Request.Files[0];
         }

    }

0 votes

Alors, comment voulez-vous afficher "msg" comme une image dans img ?

0 votes

Vous devriez supprimer cette réponse et récupérer vos points de réputation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X