Tải lên / Hiển thị Hình ảnh trong MVC 4


83

Có ai biết về bất kỳ hướng dẫn từng bước nào về cách tải lên / hiển thị hình ảnh từ cơ sở dữ liệu bằng Entity Framework không? Tôi đã kiểm tra các đoạn mã, nhưng tôi vẫn không rõ về cách nó hoạt động. Tôi không có mã, vì ngoài việc viết một biểu mẫu tải lên, tôi bị mất. Bất kỳ (và tôi có nghĩa là bất kỳ) giúp đỡ được đánh giá rất cao.

Trên một chú thích, tại sao không có cuốn sách nào đề cập đến chủ đề này? Tôi có cả Pro ASP.NET MVC 4 và Professional MVC4, và họ không đề cập đến nó.


6
Nếu bạn làm theo Pro ASP MVC 4những SportsStore Tutorialkhông che khởi đầu này trênpage 292
Komengem

bạn đúng. Tôi thậm chí không nhận thấy. Đang tìm kiếm một chương về nó. Cảm ơn
rogerthat

2
Tôi biết điều này là dành cho MVC 4, nhưng câu hỏi này sẽ vẫn hiển thị khi tìm kiếm MVC 5. - Tôi đã tìm thấy một hướng dẫn tuyệt vời bao gồm cả Tải lên cơ sở dữ liệu khi Tải lên máy chủ tệp trong Mvc 5 bằng cách sử dụng EF 6 trên MikesDotNetting mikesdotnetting. com / article / 259 /…
Vahx

Chương trong sách bao gồm việc tải hình ảnh lên cơ sở dữ liệu, nơi hầu hết mọi người muốn lưu đường dẫn đến cơ sở dữ liệu và hình ảnh vào một thư mục.
whisk

Câu trả lời:


142

Hãy xem những điều sau đây

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

bộ điều khiển của bạn nên có phương pháp hành động sẽ chấp nhận 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");
    }

Cập nhật 1

Trong trường hợp bạn muốn tải tệp lên bằng jQuery với asynchornously, thì hãy thử bài viết này .

mã để xử lý phía máy chủ (để tải lên nhiều lần) là;

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

điều khiển này cũng trả về tên hình ảnh (trong javascript gọi lại) mà sau đó bạn có thể sử dụng nó để hiển thị hình ảnh trong DOM.

CẬP NHẬT 2

Ngoài ra, bạn có thể thử Tải lên tệp không đồng bộ trong MVC 4 .


ồ. Cảm ơn. Tôi se thử no. Bất kỳ tài nguyên nào, mà bạn có thể nghĩ ra, tôi có thể đọc để nâng cao kiến ​​thức của mình về chủ đề này? Tôi không tìm thấy gì cả.
rogerthat

1
sau khi làm file.SaveAs(path)như thế nào tôi có thể xóa tệp khỏi đường dẫn đó?
J86

Sử dụng angularjs để gửi hình ảnh loại tập tin html để phía máy chủ là dễ dàng hơn, stackoverflow.com/a/26409100/900284
Frank Myat Thu

@FrankMyatThu chỉ sử dụng góc để tải hình ảnh lên? Nghe có vẻ hơi kỳ quặc phải không?
Idrees Khan

1
@DotNetDreamer Tôi sẽ kiểm tra trang web của bạn càng sớm càng tốt vì có lỗi chi tiết khi đăng nhập trên đó làm lộ một số thông tin khá quan trọng vào lúc này ...
Gareth

46

Đây là một hướng dẫn ngắn:

Mô hình:

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

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

Lượt xem:

  1. Tạo nên:

    @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. Chỉ mục (để hiển thị):

    @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. Bộ điều khiển (Tạo)

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

Hy vọng điều này sẽ giúp :)


Wow, cảm ơn bạn rất nhiều vì điều này. Điều gì sẽ xảy ra nếu tôi muốn giới hạn hình ảnh ở dạng jpeg?
Kala J

@KalaJ Nếu bạn muốn hạn chế hình ảnh tải lên chỉ jpg, bạn có thể thêm thuộc tính accept (Html5 chỉ hoạt động trong Chrome và FF không phải IE). Hoặc bạn có thể kiểm tra phần mở rộng trong bộ điều khiển filename.LastIndexOf(".")một cái gì đó tương tự. Hope this helps
Jordy van Eijk

@JordyvanEijk, tôi đã sử dụng thuộc tính accept nhưng thuộc tính này chỉ hoạt động trong Chrome. Nó không hoạt động trong FF hoặc IE. Tôi cần một số hình thức xác nhận khác.
Kala J

1
@KalaJ Majbe bạn có thể làm điều gì đó với các file Api Html5 Nếu bạn cần một số hướng dẫn Dưới đây là
Jordy van Eijk

2
Tin tặc có thể tải lên các tệp độc hại mà không cần xác thực phía máy chủ.
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];
         }


    }

Vì vậy, làm thế nào bạn sẽ hiển thị "msg" dưới dạng hình ảnh cho img?
Eaglei 22

Bạn nên xóa câu trả lời này và lấy lại điểm Danh tiếng.
noobprogrammer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.