【问题标题】:ASP.NET MVC: loading images from database and displaying their in viewASP.NET MVC:从数据库加载图像并在视图中显示它们
【发布时间】:2011-05-07 17:58:37
【问题描述】:

我们的数据库中有一些图像,并希望在视图中显示它们。我找到了两种方法来做到这一点 - 第一种:我们在控制器中创建从数据库中获取图像并返回 FileContentResult 的操作方法:

public ActionResult GetImage( int id )
    {
        var imageData = ...get bytes from database...

        return File( imageData, "image/jpg" );
    }

查看代码:

<img src='<%= Url.Action( "GetImage", "image", new { id = ViewData["imageID"] } ) %>' />

第二种方式是使用HttpHandler:

public void ProcessRequest(HttpContext Context)
  {
      byte [] b = your image...;
      Context.Response.ContentType = "image/jpeg";
      Context.Response.BinaryWrite(b);
  }

查看代码:

<img src="AlbumArt.ashx?imageId=1" />

第一个问题是实现此功能最有效(工作更快)的方法是什么(以及为什么它工作得更快)?
第二个问题 - 当我们第一次调用动作方法返回这个视图时,有没有办法将图像直接放入我们的视图中?我的意思是,在操作方法中,我们从数据库中获取图像列表并将它们作为列表传递给视图,并在视图中使用以下代码:

<%=Html.Image(Model[i])%>

该代码必须直接从模型中将图像放入视图中。

【问题讨论】:

  • 您是否考虑将图像文件放在数据库之外?
  • 是的,我将大部分图像放在文件系统中,但我对上述解决方案感兴趣。

标签: c# asp.net-mvc image


【解决方案1】:

这两种方法在性能上不会有太大差异。显然,使用 http 处理程序将是最快的,因为请求不会经历 MVC 生命周期(路由、实例化控制器、模型绑定、调用操作),但我认为这是一个微优化,我个人会使用第一种方法,因为它更适合 MVC 场景。如果您稍后通过执行大量负载测试意识到这是您的应用程序的瓶颈,您可以随时切换到 http 处理程序方法。

至于你的第二个问题是关于助手的,答案是否定的,你不能轻易做到这一点。唯一的可能是使用data URI scheme,但并非所有浏览器都支持。这样,如果您的模型具有图像的字节数组,您可以编写一个助手来呈现以下内容:

<img src="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAA..." alt="Red dot" />

图像数据直接经过 base64 编码到页面中。另一个缺点是这些图像永远不会被缓存,您的 HTML 页面可能会变得非常大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多