使用 Entity Framework 5 代码优先的 MVC4 图像上传
MVC4 Image Upload Using Entity Framework 5 Code First
我是 MVC 的初学者,我正在尝试将图像添加到数据库,然后在前端检索它。
我已经添加了我的 class:
using System;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Web.Mvc;
namespace TestProject.Data
{
public partial class UpcomingEvent
{
public UpcomingEvent()
{
EventDate = DateTime.Now;
DateTimeStamp = DateTime.Now;
Cancelled = false;
}
[Key]
public int EventID { get; set; }
public DateTime EventDate { get; set; }
public string Title { get; set; }
public string Blurb { get; set; }
public string Body { get; set; }
public byte[] EventImage { get; set; }
public DateTime DateTimeStamp { get; set; }
public bool Cancelled { get; set; }
}
}
然后使用 Entity Framework 创建了一个包含 read/write 操作的控制器。在创建/编辑等所有字段显示图像以外。
我需要将什么添加到我的控制器或视图中才能将每个条目的图像发送到数据库?
您可以先上网搜索
查看此页面:
http://www.mikesdotnetting.com/article/125/asp-net-mvc-uploading-and-downloading-files
这是我们的保险代理网站之一的工作示例。我将徽标存储在一个目录中。我还调整了徽标的大小,并使用 ImageResizer 创建了一个移动版本(可以使用包管理器安装)。虽然这不是必需的,但它是一个很好的工具,尤其是在接受最终用户的上传时。
查看:
@using (Html.BeginForm("Upload","LogoController", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<div class="form-horizontal">
<div class="control-group">
<label>
Upload A Logo</label>
<div class="controls">
<input type="file" name="logo" />
</div>
</div>
</div>
<p><input type="submit" name="Upload" value="Upload" class="button" />
</p>
}
控制器:
[HttpPost]
public ActionResult Upload(HttpPostedFileBase logo)
{
SaveLogos(logo);
return View();
}
private void SaveLogos(HttpPostedFileBase logo)
{
if (logo != null && logo.ContentLength > 0)
{
var ext = Path.GetExtension(logo.FileName);
var path = Server.MapPath("~/Content/Images");
var full = Path.Combine(path, "logo.png");
path = Path.Combine(path, "Mobile");
var mobile = Path.Combine(path, "logo.png");
var tmp = Path.GetTempFileName() + "." + ext;
try
{
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
if (System.IO.File.Exists(full))
{
System.IO.File.Move(full, full.Replace(".png", DateTime.Now.ToString("yyyyMMdd_hhmmss") + ".png"));
}
if (System.IO.File.Exists(mobile))
{
System.IO.File.Move(mobile, mobile.Replace(".png", DateTime.Now.ToString("yyyyMMdd_hhmmss") + ".png"));
}
// convert to png
logo.SaveAs(tmp);
var job = new ImageResizer.ImageJob(tmp, full,
new ImageResizer.ResizeSettings("width=460;height=102;format=png;mode=pad"));
job.Build();
// create mobile image
job = new ImageResizer.ImageJob(tmp, mobile,
new ImageResizer.ResizeSettings("width=190;height=44;format=png;mode=pad"));
job.Build();
}
catch (Exception e)
{
Logging.LogError(e, ControllerContext);
}
finally
{
System.IO.File.Delete(tmp);
}
}
}
将其存储到 EF 中需要获取图像的字节,可能对它们进行编码(可能是 base64),然后将结果存储到您的对象中。 CodeProject Article 提供了将文件存储到 varbinary(MAX) 字段中的示例。
最后,如果我没有提供有关在您的数据库中存储图像的警告,那我就是疏忽了。如果图像大于 1MB,Microsoft 不建议这样做。有关类似的讨论,请参阅 Entity Framework Column Type for Base64 String。
我是 MVC 的初学者,我正在尝试将图像添加到数据库,然后在前端检索它。
我已经添加了我的 class:
using System;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Web.Mvc;
namespace TestProject.Data
{
public partial class UpcomingEvent
{
public UpcomingEvent()
{
EventDate = DateTime.Now;
DateTimeStamp = DateTime.Now;
Cancelled = false;
}
[Key]
public int EventID { get; set; }
public DateTime EventDate { get; set; }
public string Title { get; set; }
public string Blurb { get; set; }
public string Body { get; set; }
public byte[] EventImage { get; set; }
public DateTime DateTimeStamp { get; set; }
public bool Cancelled { get; set; }
}
}
然后使用 Entity Framework 创建了一个包含 read/write 操作的控制器。在创建/编辑等所有字段显示图像以外。
我需要将什么添加到我的控制器或视图中才能将每个条目的图像发送到数据库?
您可以先上网搜索
查看此页面: http://www.mikesdotnetting.com/article/125/asp-net-mvc-uploading-and-downloading-files
这是我们的保险代理网站之一的工作示例。我将徽标存储在一个目录中。我还调整了徽标的大小,并使用 ImageResizer 创建了一个移动版本(可以使用包管理器安装)。虽然这不是必需的,但它是一个很好的工具,尤其是在接受最终用户的上传时。
查看:
@using (Html.BeginForm("Upload","LogoController", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<div class="form-horizontal">
<div class="control-group">
<label>
Upload A Logo</label>
<div class="controls">
<input type="file" name="logo" />
</div>
</div>
</div>
<p><input type="submit" name="Upload" value="Upload" class="button" />
</p>
}
控制器:
[HttpPost]
public ActionResult Upload(HttpPostedFileBase logo)
{
SaveLogos(logo);
return View();
}
private void SaveLogos(HttpPostedFileBase logo)
{
if (logo != null && logo.ContentLength > 0)
{
var ext = Path.GetExtension(logo.FileName);
var path = Server.MapPath("~/Content/Images");
var full = Path.Combine(path, "logo.png");
path = Path.Combine(path, "Mobile");
var mobile = Path.Combine(path, "logo.png");
var tmp = Path.GetTempFileName() + "." + ext;
try
{
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
if (System.IO.File.Exists(full))
{
System.IO.File.Move(full, full.Replace(".png", DateTime.Now.ToString("yyyyMMdd_hhmmss") + ".png"));
}
if (System.IO.File.Exists(mobile))
{
System.IO.File.Move(mobile, mobile.Replace(".png", DateTime.Now.ToString("yyyyMMdd_hhmmss") + ".png"));
}
// convert to png
logo.SaveAs(tmp);
var job = new ImageResizer.ImageJob(tmp, full,
new ImageResizer.ResizeSettings("width=460;height=102;format=png;mode=pad"));
job.Build();
// create mobile image
job = new ImageResizer.ImageJob(tmp, mobile,
new ImageResizer.ResizeSettings("width=190;height=44;format=png;mode=pad"));
job.Build();
}
catch (Exception e)
{
Logging.LogError(e, ControllerContext);
}
finally
{
System.IO.File.Delete(tmp);
}
}
}
将其存储到 EF 中需要获取图像的字节,可能对它们进行编码(可能是 base64),然后将结果存储到您的对象中。 CodeProject Article 提供了将文件存储到 varbinary(MAX) 字段中的示例。
最后,如果我没有提供有关在您的数据库中存储图像的警告,那我就是疏忽了。如果图像大于 1MB,Microsoft 不建议这样做。有关类似的讨论,请参阅 Entity Framework Column Type for Base64 String。