Загрузка / отображение изображений в MVC 4

84

Кто-нибудь знает какие-либо пошаговые руководства о том, как загружать / отображать изображения из базы данных с помощью Entity Framework? Я проверил фрагменты кода, но до сих пор не понимаю, как это работает. У меня нет кода, потому что, помимо написания формы загрузки, я потерялся. Любая (и я имею в виду любая) помощь приветствуется.

Кстати, почему ни одна книга не освещает эту тему? У меня есть как Pro ASP.NET MVC 4, так и Professional MVC4, и они не упоминают об этом.

заметано
источник
6
Если вы последуете Pro ASP MVC 4за SportsStore Tutorialэтим, это начнетсяpage 292
Коменгем,
вы правы. Я даже не заметил. Искал об этом главу. Спасибо
rogerthat
2
Я знаю, что это для MVC 4, но этот вопрос все равно появится при поиске MVC 5. - Я нашел отличный учебник, в котором рассматривается как загрузка в базу данных, так и загрузка на файловый сервер в Mvc 5 с использованием EF 6 на MikesDotNetting mikesdotnetting. com / article / 259 /…
Vahx
Глава книги посвящена загрузке изображений в базу данных, где большинство людей хотят сохранить путь к базе данных, а изображение - в папку.
венчик

Ответы:

144

Взгляните на следующие

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

у вашего контроллера должен быть метод действия, который будет принимать 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");
    }

Обновление 1

Если вы хотите загружать файлы с помощью jQuery асинхронно, попробуйте эту статью .

код для обработки серверной части (для множественной загрузки):

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

этот элемент управления также возвращает имя изображения (в обратном вызове javascript), которое затем можно использовать для отображения изображения в DOM.

ОБНОВЛЕНИЕ 2

Кроме того, вы можете попробовать асинхронную загрузку файлов в MVC 4 .

Идрис Хан
источник
Вау. Благодарю. Я попробую. Какие ресурсы, которые вы можете придумать, я могу прочитать, чтобы расширить свои знания по этому вопросу? Я ничего не могу найти.
Роджер,
1
после этого file.SaveAs(path)как я могу удалить файл с этого пути?
J86,
Использование angularjs для отправки изображения типа файла html на сервер проще, stackoverflow.com/a/26409100/900284
Фрэнк Мьят Чт,
@FrankMyatThu использует angular только для загрузки изображений? Разве это не звучит немного странно?
Idrees Khan 08
1
@DotNetDreamer Я бы проверил ваш веб-сайт как можно скорее, так как там есть подробный журнал ошибок, раскрывающий некоторую довольно важную информацию на данный момент ...
Гарет
46

Вот краткое руководство:

Модель:

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

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

Посмотреть:

  1. Создайте:

    @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. Индекс (для отображения):

    @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. Контроллер (Создать)

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

Надеюсь, это поможет :)

Миле Милошески
источник
Вау, большое вам спасибо за это. Что, если бы я хотел ограничить изображение форматом jpeg?
Kala J
@KalaJ Если вы хотите ограничить загружаемые изображения только jpg, вы можете добавить атрибут accept (Html5 работает только в Chrome, а FF не в IE). Или вы можете проверить расширение в контроллере filename.LastIndexOf(".")примерно так. Надеюсь, это поможет
Джорди ван Эйк
@JordyvanEijk, я использовал атрибут accept, но он работает только в Chrome. Это не работает в FF или IE. Мне нужна другая форма подтверждения.
Kala J
1
@KalaJ Majbe, вы можете что-то сделать с Api файла Html5. Если вам нужно какое-то руководство. Вот оно
Джорди ван Эйк,
2
Хакеры смогут загружать вредоносные файлы без проверки на стороне сервера.
arao6
-16
        <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];
         }


    }
user3789888
источник
Итак, как бы вы отобразили "msg" как изображение для img?
eaglei22
Вы должны удалить этот ответ и вернуть свои очки репутации.
noobprogrammer