ASP.NET MVC:从数据库加载图像并在视图中显示

10

我们的数据库中有一些图像,想要在视图中显示它们。我找到了两种方法来实现这个目标 - 第一种:我们在控制器中创建一个动作方法,从数据库获取图像并返回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])%>

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


你是否考虑将图像文件放在数据库之外? - Marco Staffoli
是的,我把大部分图片放在文件系统中,但我对上述描述的解决方案很感兴趣。 - Kai
1个回答

6
两种方法的性能差别不大。显然,使用http处理程序是最快的,因为请求不需要经过MVC生命周期(路由、实例化控制器、模型绑定、调用操作),但我认为这是微观优化,我个人会使用第一种方法,因为它更适合MVC场景。如果您后来发现这是应用程序的瓶颈,可以通过执行广泛的负载测试来切换到http处理程序方法。

至于您的第二个问题,答案是否定的,您无法轻松地这样做。唯一的可能性是使用数据URI方案,但并非所有浏览器都支持。这样,如果您的模型具有图像的字节数组,则可以编写一个帮助程序,呈现以下内容:

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

图像数据直接以base64编码形式嵌入到页面中。另一个缺点是这些图片永远不会被缓存,你的HTML页面可能会变得非常大。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接