代码之家  ›  专栏  ›  技术社区  ›  Jake Stevenson

Castle ActiveRecord/Monorail模型中图像的最佳实践

  •  0
  • Jake Stevenson  · 技术社区  · 17 年前

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

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

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

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

    有人看过如何处理这类事情的好教程吗?这似乎是一个足够普遍的要求,我会找到一些单轨铁路的具体内容,但到目前为止,我的搜索结果是空的。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    关于在数据库或文件中存储图像,请参见 this question .

    如果你决定把它存储在数据库中,最重要的是 不要 找回 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 代替原始 字节[] 实现 IUserType . 但请记住,图像是可识别的,而且 很辛苦 在正确的时间处理它。

    实现返回图像的单轨控制器非常简单…只使用 [ARFetch] 得到 用户配置文件图片 并使用适当的内容类型写入响应流。

    推荐文章