我正处于将图像作为字节数组存储在SQL数据库中的情况。我正在使用EF,因此我的模型中有一个字节数组自动属性,然后通过代码首先将其提交到数据库。
我想将一个只读属性(一个Image)放入我的模型中,并在调用get访问器时将字节数组转换为Image。两个问题:
如果您愿意,我可以发布代码,但我认为没有必要,如果有人想查看我的代码,只需发表评论。
答案 0 :(得分:2)
1)我应该使用什么样的图像?应该是System.Drawing 图像,还是较新的BitmapImage?
他们都不是。您应该使用字节数组(byte[]
)。
2)这会导致代码优先和EF的问题吗?
我不这么认为。我不是EF的专家,但我认为应该可以将byte[]
属性映射到数据库中相应的varbinary(max)
列。
现在回到您关于在视图模型上显示图像和属性的原始问题。即使您这样做,也不能将此字节数组属性显示为视图中的图像,除非您使用并非所有浏览器都广泛支持的data uri scheme
。如果您决定走这条路线,这可能是这样的:
@model MyViewModel
...
<img src="data:image/png;base64,@Html.Raw(Convert.ToBase64String(Model.Image))" alt="some image">
但是,如果您正在寻找一种适用于所有浏览器的解决方案,您可以设计一个控制器操作,将数据库中的图像作为字节数组提取,然后将其传输到响应中。接下来,您可以在<img>
代码中引用此操作。
我们举一个例子:
public ActionResult Image(int id)
{
byte[] imageData = ... go query your database to retrieve the corresponding
image record using the id
return File(imageData, "image/png");
}
然后在主视图中只需将<img>
标记指向此控制器操作:
@model MyViewModel
...
<img src="@Url.Action("Image", "SomeController", new { id = Model.Id })">