我有一个测试房地产应用程序。性能不佳的问题。一个属性可以有一个或多个图像。
这些图像作为二进制文件存储在数据库中,现在我想创建我希望更好的解决方案,将图像保存在服务器硬盘中,并在数据库中使用参考路径。
我不知道该怎么做。我应该如何设计我的数据库表?如何将图像保存到服务器及其到数据库的路径?我将发布我当前的代码。
值得一提的是,我需要解决方案,我应该将图像与其他属性信息一起上传(在同一页面上,带有浏览按钮)。
实体
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 是从网络表单发布的
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;
这种方法有效,实体之间的映射没问题,现在我应该改变什么以便将图像保存在服务器硬盘及其对数据库的引用。