2

我有一个测试房地产应用程序。性能不佳的问题。一个属性可以有一个或多个图像。

这些图像作为二进制文件存储在数据库中,现在我想创建我希望更好的解决方案,将图像保存在服务器硬盘中,并在数据库中使用参考路径。

我不知道该怎么做。我应该如何设计我的数据库表?如何将图像保存到服务器及其到数据库的路径?我将发布我当前的代码。

值得一提的是,我需要解决方案,我应该将图像与其他属性信息一起上传(在同一页面上,带有浏览按钮)。

实体

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;

这种方法有效,实体之间的映射没问题,现在我应该改变什么以便将图像保存在服务器硬盘及其对数据库的引用。

4

1 回答 1

1

将数据作为原始文件存储在数据库服务器磁盘上有其自身的问题,主要问题是您必须配置从客户端对文件系统的访问 - 在这种情况下是 Web 服务器。

如果您使用的是 Sql Server 2008 或更高版本,则有一个中间立场:FILESTREAM

数据存储在文件中,但可以通过数据库访问。因此,您可以通过数据库连接获得参照完整性和访问权限,而不会导致数据库本身膨胀。

于 2012-06-09T08:51:54.503 回答