在mvc3中处理图像的不同方法

时间:2012-06-09 08:27:10

标签: c# asp.net-mvc-3 database-design file-upload

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

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

我不知道如何做到这一点。我应该如何设计我的数据库表?如何将映像保存到服务器及其到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;}
}

Db设计

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图像是从webform发布的

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;

这种方法有效,实体之间的映射是可以的,现在我应该更改什么才能在服务器硬盘上保存图像及其对db的引用。

1 个答案:

答案 0 :(得分:1)

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

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

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