Завантаження / відображення зображень у MVC 4


83

Хто-небудь знає про покрокові підручники про те, як завантажувати / відображати зображення з бази даних за допомогою Entity Framework? Я перевірив фрагменти коду, але досі не зрозумів, як це працює. У мене немає коду, бо, окрім написання форми для завантаження, я загубився. Будь-яка (і я маю на увазі будь-яка) допомога дуже вдячна.

Побіжно, чому жодна книга не висвітлює цю тему? У мене є як Pro ASP.NET MVC 4, так і Professional MVC4, і вони про це не згадують.


6
Якщо ви будете слідувати дійсно покриває цей старт наPro ASP MVC 4SportsStore Tutorialpage 292
Komengem

ти маєш рацію. Я навіть не помітив. Шукав главу про це. Дякую
Роджер, що

2
Я знаю, що це для MVC 4, але це питання все одно з’явиться під час пошуку MVC 5. - Я знайшов чудовий підручник, який охоплює як Завантажити до бази даних як Завантажити на файловий сервер у Mvc 5 за допомогою EF 6 на MikesDotNetting mikesdotnetting. com / article / 259 /…
Vahx

Розділ книги охоплює завантаження зображень до бази даних, де більшість людей хочуть зберегти шлях до бази даних, а зображення до папки.
віночок

Відповіді:


142

Погляньте на наступне

@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 .


Ого. Дякую. Я спробую це. Будь-які ресурси, про які ви можете придумати, я можу прочитати для подальшого вивчення цього питання? Я нічого не можу знайти.
rogerthat

1
зробивши, file.SaveAs(path)як я можу потім видалити файл із цього шляху?
J86

Використовувати angularjs для надсилання зображень типу HTML-файлу на сторону сервера простіше, stackoverflow.com/a/26409100/900284
Френк Майат, Чт

@FrankMyatThu використовує angular лише для завантаження зображень? хіба це не звучить трохи дивно?
Idrees Khan

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 ти можеш щось зробити з файлом Html5 Api. Якщо тобі потрібен якийсь підручник Ось це
Jordy van Eijk

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


    }

Отже, як би ви показали "msg" як зображення для зображення?
eaglei22

Ви повинні видалити цю відповідь і повернути свої бали репутації.
noobprogrammer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.