我有一个测试房地产应用程序。表现不佳的问题。一个属性可以有一个或多个图像。
这些图像作为二进制文件存储在数据库中,现在我想创建我希望更好的解决方案,在服务器硬盘内部保存图像,并在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的引用。
答案 0 :(得分:1)
将数据作为原始文件存储在数据库服务器磁盘上有其自身的问题,主要问题是您必须从客户端配置对文件系统的访问权限 - 在这种情况下是Web服务器。
如果您使用的是Sql Server 2008或更高版本,则存在中间立场:FILESTREAM
数据存储在文件中,但可以通过数据库访问。因此,您可以通过数据库连接获得参照完整性和访问权限,而不会使数据库本身膨胀。