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

时间:2013-08-09 20:36:13

标签: c# .net asp.net-mvc-4

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

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

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

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

由于

3 个答案:

答案 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. 与EF的连接
  2. 定位图片的调用
  3. 图像名称的内容
  4. 可能更改输出缓存

答案 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”