我们的“用户”模型上需要一张小型的图片,我并不完全确定如何处理它。当然我们可以将它保存到磁盘上的文件夹并将路径/文件名存储到数据库中,但我想我宁愿将它存储在数据库本身中。
我的第一个想法是在模型上拥有这样的属性:
[Property]
public byte[] ProfilePicture
{
get;
set;
}
但是我确实觉得我必须采用这种方式让它以这种方式工作 - 从数据库中获取一个字节数组,然后将其转换为具有某种处理程序的图像。
有没有人看过如何处理这类事情的好教程?似乎这是一个很常见的要求,我会发现MonoRail特有的东西,但到目前为止,我的搜索结果是空的。
答案 0 :(得分:1)
关于在数据库或文件上存储图像,请参阅this question。
如果您决定将其存储在数据库中,最重要的是每次查询用户时不检索byte[]
,这可能会很多数据和性能问题。要做到这一点,您可以将图像存储在另一个表中,或将byte[]
映射到具有相同表格的另一个实体(假设用户只能有一张图片):
[ActiveRecord("users")]
public class UserWithoutPicture {
[PrimaryKey]
public virtual int Id {get;set;}
...
[BelongsTo]
public virtual UserProfilePicture ProfilePicture {get;set;}
}
[ActiveRecord("users")]
public class UserProfilePicture {
[PrimaryKey]
public virtual int Id {get;set;}
[Property]
public virtual byte[] Image {get;set;}
}
这会有一些时髦的行为。例如,对于任何给定用户,ProfilePicture
永远不会为空。你不会真正插入或删除UserProfilePicture
,因为它实际上是用户,而是你总是会更新。而且你需要额外加入,你必须知道SELECT N+1。这只是我的头脑,完全未经测试。
结论:将图像存储在另一个表格中要灵活得多。
如果您希望方便处理Image
而不是原始byte[]
,请实施IUserType
。但请记住,Image是一个IDisposable,并且非常难以在适当的时候处理它。
实现返回图像的Monorail控制器非常简单......只需使用[ARFetch]
通过id获取UserProfilePicture
并使用适当的内容类型写入Response流。