在MVC 4中上载/显示图像


83

任何人都知道有关如何使用实体框架从数据库上载/显示图像的分步教程吗?我已经检查了代码片段,但是我仍然不清楚它是如何工作的。我没有代码,因为除了编写上传表单之外,我也迷路了。任何(我的意思是任何)帮助都将不胜感激。

在旁注中,为什么没有书籍涵盖这一主题?我同时拥有Pro ASP.NET MVC 4和Professional MVC4,他们没有提及它。


6
如果您遵循Pro ASP MVC 4该指南的相关SportsStore Tutorial规定,那么page 292
Komengem 2013年

你是对的。我什至没有注意到。正在寻找有关它的章节。谢谢
rogerthat 2013年

2
我知道这是针对MVC 4的,但是在寻找MVC 5时仍然会出现此问题。-我找到了一个很棒的教程,涵盖了在MikesDotNetting mikesdotnetting
Vahx

本书中的章节涵盖了将图像上传到数据库,大多数人都希望将图像保存到数据库的路径以及将图像保存到文件夹。
拂尘

Answers:


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 2013年

1
完成后,file.SaveAs(path)如何从该路径删除文件?
J86

使用angularjs将html文件类型的图像发送到服务器端更容易,stackoverflow.com
Frank Myat 2015年

@FrankMyatThu仅使用角度上传图像?这听起来有点奇怪吗?
Idrees Khan

1
@DotNetDreamer我会尽快检查您的网站,因为登录时出现了详细的错误,此刻暴露了一些相当重要的信息……
Gareth

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怎么办?
卡拉J

@KalaJ如果要将上传的图像限制为仅jpg,则可以添加accept属性(Html5仅在Chrome和FF中有效,而不是IE)。或者,您也可以在控制器中检查扩展名filename.LastIndexOf(".")。希望这会
有所

@JordyvanEijk,我使用了accept属性,但是它仅适用于Chrome。在FF或IE中不起作用。我需要其他形式的验证。
Kala J

1
@KalaJ Majbe,您可以使用Html5 File Api做一些事情,如果需要一些教程,这是
Jordy van Eijk 2013年

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”作为图像显示给img?
eaglei22 '17

您应该删除此答案,并重新获得信誉分数。
noobprogrammer19年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.