我有一个基于Entity Framework和Microsoft SQL Server 2008的ASP.NET MVC解决方案。我需要创建一个允许我的用户上传文件的功能。
我想要的是:
答案 0 :(得分:42)
在实体模型中,将BLOB数据库列映射到byte[]
属性。将上载文件的内容分配给实体对象的该属性,并将更改保存在ObjectContext
。
要计算哈希值,您可以使用MD5CryptoServiceProvider
类
答案 1 :(得分:10)
在SQL Server 2008数据库中存储文件的“正确”方法是use the FILESTREAM data type。我不知道实体框架支持这一点,但您当然可以尝试看看会发生什么。
也就是说,大多数时候人们这样做,他们不会将文件存储在数据库中。这样做意味着您需要通过ASP.NET和数据库服务器来提供可以直接从Web服务器提供的文件。它还可能使您的数据库和站点的备份图片有些复杂化。因此,当我们将文件上传到MVC / Entity Framework时,我们只存储对数据库中文件位置的引用,并将文件本身存储在其他位置。
显然,哪种策略适合您,很大程度上取决于您的申请细节。
答案 2 :(得分:5)
以下是我为Podcasts做的事情:
ID Title Path Summary UploadDate --- ----- -------- ---------------- ----------- 1 TestPodcast /Podcasts/ep1.mp3 A test podcast 2010-02-12
path
存储对Podcast物理位置的引用。我在File Uploads with ASP.NET MVC上使用了来自Scott Hanselman的帖子来处理文件上传部分。
答案 3 :(得分:0)
根据@Thomas的答案,一个工作示例(仅用于文件上传,因为这个在谷歌中排在第一位):
public void AddDocument(HttpPostedFileBase file)
{
try
{
using (TransactionScope scope = new TransactionScope())
{
try
{
using (var ctx = new Entities())
{
EntityDoc doc = new EntityDoc(); //The document table
doc.DocumentFileName = file.FileName; //The file Name
using (var reader = new System.IO.BinaryReader(file.InputStream))
{
doc.DocumentFile = reader.ReadBytes(file.ContentLength); // the Byte [] Field
}
ctx.EntityDocs.Add(doc);
ctx.SaveChanges();
scope.Complete();
}
}
catch (Exception ex)
{
throw ex;
}
}
}
catch (Exception ex)
{
throw ex;
}
}