使用ASP.Net MVC3显示包含在byte []中的图像

时间:2011-05-18 06:51:40

标签: c# asp.net-mvc asp.net-mvc-3 razor strong-typing

我的视角很强。这个强类型有一个由byte []组成的字段,这个数组包含一个图片。

是否可以使用@ Html.Image(Model.myImage)等显示此图像?

非常感谢

6 个答案:

答案 0 :(得分:17)

您可以创建一个控制器操作方法,将图像作为FileContentResult返回:

public FileContentResult Display(string id) {
   byte[] byteArray = GetImageFromDB(id);
   return new FileContentResult(byteArray, "image/jpeg");
}

然后,您可以使用模型中的图像ID为视图中的action方法创建ActionLink。

答案 1 :(得分:8)

这取决于图像的大小。如果它很小,你可以写一些东西到base-64编码并将其嵌入到html like any of these中。

对于concrete example from here

<img src="data:image/gif;base64,R0lGODlhUAAPAKIAAAsLav///88PD9WqsYmApmZmZtZfYmdakyH5BAQUAP8ALAAAAABQAA8AAAPbWLrc/jDKSVe4OOvNu/9gqARDSRBHegyGMahqO4R0bQcjIQ8E4BMCQc930JluyGRmdAAcdiigMLVrApTYWy5FKM1IQe+Mp+L4rphz+qIOBAUYeCY4p2tGrJZeH9y79mZsawFoaIRxF3JyiYxuHiMGb5KTkpFvZj4ZbYeCiXaOiKBwnxh4fnt9e3ktgZyHhrChinONs3cFAShFF2JhvCZlG5uchYNun5eedRxMAF15XEFRXgZWWdciuM8GCmdSQ84lLQfY5R14wDB5Lyon4ubwS7jx9NcV9/j5+g4JADs=" alt="British Blog Directory" width="80" height="15">

如果图像具有任何可观的大小,您可能需要编写一条路径,允许通过某些键查找图像,即/images/{id}之类的路径 - 在该路径中,您获取图像二进制并使用return File(bytes, contentType),另外设置缓存标头(并记住重新检查任何必要的安全性)。在你的HTML中你只有一个

<img src="/images/@imageId" ... />

(使用razor语法,但对于aspx类似)。

单独的路由方法需要额外跳转到服务器,但允许在客户端进行缓存(内联base-64方法将数据放在每个请求上)。

答案 2 :(得分:7)

如果您已经将模型中的图片作为byte[]数组加载,则可以在@ his answer:

中提及@Marc Gravell
<img src="data:image;base64,@System.Convert.ToBase64String(Model.Photo)" />

这大大简化了整个过程,您不需要使用特定的FileContentResult操作方法并再次访问数据库(请参阅@Dmitry S的answer)以获取{{1}你的图像/照片的数组,因为你已经在模型中加载了它。

答案 3 :(得分:4)

听起来你需要一个新的动作来获取字节数组(来自数据库?)并通过File方法返回图像....

然后生成一个指向该动作的锚点,这样可以在页面加载时加载图像,从而加快显示速度。

答案 4 :(得分:1)

答案 5 :(得分:0)

我会设计一个简单的通用处理程序来为您的图像提供服务。给定一些参数,此处理程序可以从数据库加载图像,并将它们写入http输出流。

public class UserImage : IHttpHandler
{
    public bool IsReusable
    {
        get { return false; }
    }

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "image/jpeg";

        // Get the stream from the database
        var image = System.Drawing.Image.FromStream(stream);

        image.Save(context.Response.OutputStream, ImageFormat.Jpeg);
    }
}