使用ASP.NET MVC4检索数据库中存储为字节数组的图像的好方法?

Nmk*_*nas 5 .net c# asp.net-mvc-4

我正在编写一个ASP.NET MVC4应用程序,它将上传的图像存储byte[]在数据库中(使用Entity框架),然后显示它们.要在视图中显示我正在使用此代码的图像:

<img src="data:image;base64,@System.Convert.ToBase64String(item.ImageByte)" alt=""/>
Run Code Online (Sandbox Code Playgroud)

但每次刷新页面时,我都会看到浏览器没有缓存图像,只是再次渲染它会导致无用的带宽使用.

也许有更多带宽更友好的方式来显示图像?也许将上传的图像存储为'byte []'的想法首先是愚蠢的(我的应用程序只是一个简单的网页,存储有关心理学的文章:D与管理面板来实现这一点)我应该只存储图像一个文件夹?

谢谢

Ric*_*son 5

将图像存储在数据库中是一种可能的选择.有时候这是一个好主意,有时候是一个坏主意.通常,如果处理大量或大尺寸图像,建议您使用不同的存储方法重新考虑.

实际上,您目前正在做的是将图像嵌入HTML中; 这可能是好的我之前使用它需要大约5秒来计算图表的数据并且页面需要相同的数据,但在一般情况下,你最好从动作中提供图像.

所以我们需要做的是在控制器中提供一个动作来获取图像; 可能基于id - 但我会留给你.

[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;
}
Run Code Online (Sandbox Code Playgroud)

在cshtml中

<img src="@Url.Action("GetImage", "Controller", new {Id = Model.ImageId})" />
Run Code Online (Sandbox Code Playgroud)

所以在上面的代码中你需要提供

  1. 与EF的连接
  2. 定位图像的调用
  3. 图像名称的东西
  4. 可能会更改输出缓存

  • @bizzehdee对于小型网站来说,这可能是一个坏主意,但"图像不应该进入数据库"远非普遍真实的陈述. (3认同)

Tim*_*lds 3

在你HomeController添加一个像这样的函数:

[HttpGet]
public FileResult GetImage(string id)
{
    byte[] fileContents = ...; // load from database or file system
    string contentType = "image/jpeg";
    return File(fileContents, contentType);
}
Run Code Online (Sandbox Code Playgroud)

在以下位置注册此处理程序的路由Global.asax.cs

routes.MapRoute(
    "GetImage",
    "img/{id}",
    new { controller = "Home", action = "GetImage" });
Run Code Online (Sandbox Code Playgroud)

在您的网页中,使用src指向此操作的指向:

<img src="@Url.Action("GetImage", "Home", new { id = "logo.jpg" })" />
Run Code Online (Sandbox Code Playgroud)

这将解决

<img src="/img/logo.jpg" />
Run Code Online (Sandbox Code Playgroud)