2010-11-10 97 views
9

我们在数据库中有一些图像,并希望在视图中显示它们。我发现双向做到这一点 - 第一:我们创建控制器的操作方法,从数据库中获取的图像,并返回FileContentResult:ASP.NET MVC:从数据库中加载图像并在视图中显示它们

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" /> 

第一个问题是什么是最有效的(工作更多更快)的方式来实现这个功能(以及为什么它工作得更快)?
第二个问题 - 当我们第一次调用action方法返回这个视图时,是否有一种方法可以直接在视图中显示图像?我的意思是,在操作方法,我们从数据库中获取图像的列表,并考虑通过他们的名单,并考虑到使用此代码:

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

代码必须把图像转换成视图直接从模型。

+0

你是否考虑将图像文件放在db外? – 2010-11-10 11:57:11

+0

是的,我将大部分图像放置在文件系统中,但我对上述解决方案感兴趣。 – Kai 2010-11-10 13:04:22

回答

6

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

至于你的第二个问题是担心助手,答案是否定的,你不能轻易做到这一点。唯一的可能性是使用data URI scheme,但这不是所有浏览器都支持的。如果这样,你的模型具有图像的字节数组,你可以写这使得下面这样的帮手:

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

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

相关问题