0

我们的“用户”模型需要一张小的头像,我不完全确定如何处理它。当然,我们可以将它保存到磁盘上的文件夹并将路径/文件名存储到数据库中,但我想我宁愿将它存储在数据库本身中。

我的第一个想法是在模型上拥有这样的属性:

[Property] 
public byte[] ProfilePicture
{
  get;
  set;
}

但它确实感觉我必须走很长的路才能让它以这种方式工作——从数据库中获取一个字节数组,然后使用某种处理程序将其转换为图像。

有没有人看过一个关于如何处理这种事情的好教程?似乎这是一个足够普遍的要求,我会找到特定于 MonoRail 的东西,但到目前为止我的搜索都是空的。

4

1 回答 1

1

关于将图像存储在数据库或文件中,请参阅此问题

如果您决定将其存储在数据库中,最重要的是您不会在每次查询用户时都检索它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;}
}

不过,这会有一些古怪的行为。例如,对于任何给定的用户,theProfilePicture永远不会为空。您不会真正插入或删除UserProfilePicture,因为它实际上是用户,而是您总是会更新。而且你会招致额外的加入,你必须知道SELECT N+1。这只是我的想法,完全未经测试

结论:将图像存储在另一个表中要灵活得多。

如果您想方便地处理 anImage而不是 raw byte[],请实现IUserType. 但请记住,Image 是一个 IDisposable,并且很难在正确的时间处理它。

Implementing a Monorail controller that returns an image is quite straightforward... just use [ARFetch] to get the UserProfilePicture by id and write to the Response stream with the appropriate content-type.

于 2009-07-28T03:41:12.417 回答