如何使用带有Entity Framework的ASP.net MVC4上传/显示图像

时间:2013-03-27 15:08:02

标签: c# asp.net-mvc image

我有一个像这样的数据模型

    public class NewsItem
{
    public virtual int Id { get; set; }
    public virtual string NewsTitle { get; set; }
    public virtual string NewsContent { get; set; }
    public virtual byte[] NewsImage { get; set; }
    public virtual DateTime DateAdded { get; set; }
    public virtual bool IsLive { get; set; }
}

然后我通过视图显示这些数据:

@model BusinessObject.Domain.NewsItem
<div class="row-fluid">
    <h3>
        @Html.ValueFor(model => model.NewsTitle)
    </h3>
    <div class="span5">
    <img src="~/Content/images/stock.jpg" />
    </div>

<div class="span7">
<p>
    @Html.ValueFor(model => model.DateAdded)
</p>
<p>
    @Html.ValueFor(model => model.NewsContent)
</p>
</div>
 </div>

然后我在控制器中使用_db.SaveChanges()保存数据,如下所示:

[Authorize]
    [HttpPost]
    public ActionResult Create(CreateNewsViewModel input)
    {
        if (ModelState.IsValid)
        {
            var news = new NewsItem();
            news.NewsTitle = input.nTitle;
            news.NewsContent = input.nContent;
            news.DateAdded = input.nDateAdded;
            news.IsLive = input.nIsLive;
            Mydb data = new Mydb();
            data.NewsItems.Add(news);
            data.SaveChanges();
            return View("Index", data.NewsItems);

        }
        else
        {
            return View(input);
        }
    }

目前我没有图片上传位。我该怎么做?在我的数据库中,我有一个二进制字段,我的对象中的数据类型是byte []。但我不知道我需要在哪里处理图片上传?

我是否需要一个单独的动作来返回视图?关于这一点的一些指示将是宏伟的。

干杯

3 个答案:

答案 0 :(得分:9)

您需要从View和WebImage的实例上传类型file的输入字段来处理上传的图像:

查看:

<input type="file" name="image" />

控制器:

WebImage image = WebImage.GetImageFromRequest();
byte[] toPutInDb = WebImage.GetBytes();

// ... put the byte array into the database

要显示数据库中的图像,您需要一个控制器Action,它从数据库中检索字节数组并返回FileAction。您可以通过在从数据库检索的bytearray上实例化另一个WebImage实例来获取此图像(用于图像检索控制器操作):

WebImage image = new WebImage(byteArrayFromDb);

File(image.GetBytes(), "image/" + image.ImageFormat, image.FileName);

答案 1 :(得分:3)

我会这样:

在您的模型类中:

 public class NewsItem
{
    public virtual int Id { get; set; }
    public virtual string NewsTitle { get; set; }
    public virtual string NewsContent { get; set; }
    public virtual string NewsImage { get; set; } //string instead of byte because you don't wanna store your whole image file in your database, but just the path of the image, and the image you will store in a folder somewhere on the server
    public virtual DateTime DateAdded { get; set; }
    public virtual bool IsLive { get; set; }
}

在您的控制器中:

[Authorize]
    [HttpPost]
    public ActionResult Create(CreateNewsViewModel HttpPostedFileBase file)// add this 
    {
        if (ModelState.IsValid)
        {
            if (file != null)
            {
                file.SaveAs(HttpContext.Server.MapPath("~/Images/") + file.FileName);
                car.ImagePath = file.FileName;
            }
        // the rest of the code... 

        }
        else
        {
            return View(input);
        }
    }

然后在你的观点中你应该:

上传:

<input id="NewsImage" title="Upload a image" type="file" name="file" />

在foreach循环中显示添加:

@Html.DisplayFor(modelItem => item.NewsImage)

不要忘记在enctype = "multipart/form-data"

中添加Html.BeginForm

我希望这会有所帮助。

答案 2 :(得分:1)

看看jquery file uploader 您可以找到sample code

希望这有帮助