我的视角很强。这个强类型有一个由byte []组成的字段,这个数组包含一个图片。
是否可以使用@ Html.Image(Model.myImage)等显示此图像?
非常感谢
答案 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中。
<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:
<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);
}
}