テスト用の不動産アプリが 1 つあります。パフォーマンスの問題があります。1 つのプロパティに 1 つ以上の画像を含めることができます。
これらの画像はバイナリとしてデータベースに保存されます。サーバー hdd 内に画像を保存し、db 内に参照パスを使用して、より良いソリューションを作成したいと考えています。
これを行う方法がわかりません。データベーステーブルをどのように設計すればよいですか? イメージをサーバーに保存し、そのパスをデータベースに保存するには? 現在のコードを掲載します。
言及する価値があるのは、画像を他のプロパティ情報と一緒にアップロードする必要があるということです (同じページで、参照ボタンを使用して)。
エンティティ
public class Property
{
public Guid Id {get; set;}
public string Name {get; set;}
...
public List<Photo>Photos {get; set;}
}
public class Photo
{
public Property Property {get; set;}
public byte[] ImageData {get; set;}
public string ImageMimeType {get; set;}
}
データベース設計
Photo table
Id int
ImageData varbinary(MAX)
ImageMimeType varchar(50)
Version int
PropertyId int
投稿された画像などのデータをコントローラー内で処理する
[HttpPost]
public ActionResult Create(PropertyViewModel newData, IEnumerable<HttpPostedFileBase> images)
{
if (ModelState.IsValid)
{
using (ISession session = ...GetCurrentSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
Domain.Property model = new Domain.Property();
newData.ToDomainModel(model, images);
transaction.Commit();
session.Save(model);
}
}
return RedirectToAction("Index");
}
else
{
return View(newData);
}
}
そして最後に ViewModel.ToDomain 内に投稿された画像をこのように保存します。
IEnumerable Images は Web フォームから投稿されることに注意してください
List<Photo> Photos = new List<Photo>();
foreach (var image in Images)
{
if (image != null && image.ContentLength > 0)
{
Photo p = new Photo();
p.Property = x;
p.ImageMimeType = image.ContentType;
p.ImageData = new byte[image.ContentLength];
image.InputStream.Read(p.ImageData, 0, image.ContentLength);
Photos.Add(p);
}
}
x.Photos = new List<Photo>();
x.Photos = Photos;
このアプローチは機能し、エンティティ間のマッピングは問題ありません。サーバー hdd に画像を保存し、db への参照を保存するには、何を変更する必要がありますか。