0

私たちの「ユーザー」モデルには小さなプロフィール写真が必要ですが、それをどのように扱うかは完全にはわかりません。もちろん、それをディスク上のフォルダーに保存し、パス/ファイル名をデータベースに保存することもできますが、DB自体に保存した方がよいと思います。

私が最初に考えたのは、モデルに次のようなプロパティを持たせることでした:

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

しかし、このように動作させるには長い道のりを歩まなければならないように感じます-データベースからバイト配列を取得し、それを何らかのハンドラーで画像に変換します。

この種のことを処理する方法についての良いチュートリアルを見た人はいますか? MonoRail 固有の何かを見つけることが十分に一般的な要件のように思えますが、これまでのところ、私の検索は空っぽです。

4

1 に答える 1

1

データベースまたはファイルへの画像の保存については、この質問を参照してください。

DB に格納することにした場合、最も重要なことは、User をクエリするたびに取得しないことです。これは、潜在的に大量のデータとパフォーマンスの問題になる可能性があります。byte[]これを行うには、画像を別のテーブルに保存するかbyte[]、同じテーブルを持つ別のエンティティにマップします (ユーザーが画像を 1 つしか持てないと仮定します)。

[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が null になることはありません。実際にはユーザーであるため、実際に挿入または削除することはUserProfilePictureなく、代わりに常に更新します。また、追加の結合が発生するため、 SELECT N+1に注意する必要があります。それは私の頭のてっぺんから外れており、完全にテストされていません。

結論: 画像を別のテーブルに保存する方がはるかに柔軟です。

Imageraw の代わりにan を処理する利便性が必要な場合はbyte[]、 を実装しIUserTypeます。ただし、Image は IDisposable であることを忘れないでください。適切なタイミングで破棄するのは非常に困難です。

画像を返すモノレール コントローラーの実装は非常に簡単です... を使用[ARFetch]して id を取得UserProfilePictureし、適切なコンテンツ タイプで応答ストリームに書き込むだけです。

于 2009-07-28T03:41:12.417 に答える