我正在编写一个ASP.NET MVC4应用程序,它将上传的图像作为byte[]
存储在数据库中(带有Entity框架),然后显示它们。要在视图中显示我正在使用此代码的图像:
<img src="data:image;base64,@System.Convert.ToBase64String(item.ImageByte)" alt=""/>
但是每次刷新页面时,我都会看到浏览器没有缓存图像,只是再次渲染它,导致无用的带宽使用。
也许有更多带宽更友好的方式来显示图像? 也许将上传的图像存储为'byte []'的想法首先是愚蠢的(我的应用程序只是一个简单的网页,存储有关心理学的文章:D与管理面板来实现这一点)我应该只存储图像一个文件夹?
由于
答案 0 :(得分:5)
将图像存储在数据库中是一种可能的选择。有时候这是一个好主意,有时候是一个坏主意。通常,如果处理大量或大尺寸图像,建议您使用不同的存储方法重新考虑。
有效的是,您目前正在做的是将图像嵌入到HTML中;这可能是好的我之前使用它需要大约5秒来计算图表的数据并且页面需要相同的数据,但在一般情况下,你最好不要服务于行动中的形象。
所以我们需要做的是在控制器中提供一个动作来获取图像;可能是基于身份证 - 但我会留给你。
[OutputCache(Duration = 3600, VaryByParam = "id")]
public ActionResult GetImage(int Id)
{
// 1. provide connection to entity framework
var dbc = new DatabaseContext();
var item = dbc.FindItem(Id);// call to get the image from EF (2)
var ms = new MemoryStream(tem.ImageByte);
FileStreamResult result = new FileStreamResult(ms, "image/png");
result.FileDownloadName = item.ImageName; // or item.Id or something (3)
return result;
}
在cshtml中
<img src="@Url.Action("GetImage", "Controller", new {Id = Model.ImageId})" />
所以在上面的代码中你需要提供
答案 1 :(得分:3)
在HomeController
添加如下函数:
[HttpGet]
public FileResult GetImage(string id)
{
byte[] fileContents = ...; // load from database or file system
string contentType = "image/jpeg";
return File(fileContents, contentType);
}
在Global.asax.cs
注册到此处理程序的路线:
routes.MapRoute(
"GetImage",
"img/{id}",
new { controller = "Home", action = "GetImage" });
在您的网页中,使用src
指向此操作:
<img src="@Url.Action("GetImage", "Home", new { id = "logo.jpg" })" />
将解析为
<img src="/img/logo.jpg" />
答案 2 :(得分:2)
添加Generic Handler
public class Handler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
long id = Convert.ToInt64(System.Web.HttpContext.Current.Request.QueryString["id"]);
string model = (System.Web.HttpContext.Current.Request.QueryString["model"]);
DbContext Db = new DbContext();
byte[] picture = new byte[0];
switch (model)
{
case "News":
NameSpace.Models.News news = Db.Newss.Single<NameSpace.Models.News>(n => n.ID == id);
picture = news.Picture;
break;
case "Article":
NameSpace.Models.Article article = Db.Articles.Single<NameSpace.Models.Article>(a => a.ID == id);
picture = article.Picture;
break;
}
context.Response.Clear();
context.Response.ContentType = "image/jpeg";
context.Response.BinaryWrite(picture);
context.Response.Flush();
context.Response.End();
}
public bool IsReusable
{
get
{
return false;
}
}
}
*并在视图中将此源用于图像 img src =“/ Handlers / Handler.ashx?id = @ item.ID&amp; model = News”