2012-06-08 89 views
1

我有一些简单的实体,现在需要有一个配置文件图像。什么是正确的方法来做到这一点?所以,这是一对一的关系,一个图像只与一个实体相关,反之亦然。该图像应该通过webform与插入相关实体一起上传。保存图像到数据库

如果任何人都可以指出我正确的方向如何坚持图像到数据库和相关的实体将是伟大的。

+1

请参见[通过ASP.Net MVC从SQL Server下载和上传图像](http://rusanu.com/2010/12/28/download-and-upload-images-from-sql-server-with-asp- net-mvc /) –

+0

为什么这个问题已经被投票了? 当我投反对票的问题时,我发表了一条评论,解释了为什么... –

回答

4

就在方评论:我觉得是不是存储在数据库图像是一个好主意。

一般来说,在db中存储图像并不是一个好主意,因为dbs旨在存储文本不是大的二进制块。为图像存储路径并将图像放在文件夹中好得多。如果你想确定1到1的关系名称图像与实体的ID(1323.jpg)。

如果你想有图像路径应遵循的一些准则(在通用代码防守):

  • 在图像的上传检查图像是有效的(甚至使图像头的二进制校验)
  • 如果插入新实体,则不允许覆盖现有图像。
  • 作为主键的名称图像(1.jpg,2.jpg)
  • 在图像加载时,不要假设图像会在那里。
  • 不允许(如果可能的话)与图像进行手动交互(无需在机器上进行远程操作并将图像从一个地方复制到另一个地方)。手动交互可能会导致不一致。

但我认为,出于某种原因,你应该这样做。 因此,为了实现你想要的:

DB设计

  • 在表中创建一个二进制列(binary或varbinary)
  • 是,如果你创建更好的不同与1-1关系的表。然而,这个想法是避免在保湿实体时加载图像。只有在需要时才使用延迟加载方式加载图像。
  • 当你做出一个大的选择时,你必须避免加载图像(例如,如果你想加载一个组合中的所有实体,避免使用SELECT *),因为它会将无数图像加载数千。正如我所说的,这可以通过在不同的表中创建图像,或者只在SELECT中加载适当的列或通过延迟加载来完成。 (或甚至没有在DB的图像,只有路径更好)

C#代码

+1

好吧,我决定按照你的意见将图像存储在文件系统中。听起来更好的主意。我认为我需要创建另一个实体照片与id,名称,路径,desc,参考相关实体?任何链接请或建议。 – panjo

+0

我要编辑我的答案,给你一些建议。 顺便说一句我不明白为什么有些人downvoted你的问题... –

+0

我张贴另一个问题,将图像存储到文件系统http://stackoverflow.com/questions/10946789/saving-image-to-the-filesystem-使用-MVC3 – panjo

1

的代码是微不足道的,但为什么DB? 如果这是一个网站,为什么不把它保存到磁盘上可以轻松引用它的位置呢?

数据库进行了优化,以存储已知大小和相对较小的数据。你的图片最有可能会超过8KB(假设它是MAX数据类型)。 图像将存储在您的“配置文件”的独立行/页面中。

就我个人而言,我会将图像保存在已知文件夹中,并使用图像名称的id。对于没有图像并使用标准gif或类似文件的配置文件,可能通过将配置文件id的simlinks/hardlinks添加到常用gif来简化/修剪。

public class Profile 
{ 
    public int Id {get;} 
    public string Name {get; private set;} 
    public Image Picture {get; private set;} 

    public void Save() 
    { 
     using (var connection = new SqlConnection("myconnectionstring")) 
     using (var command = new SqlCommand("", connection)) 
     { 
      command.CommandText = 
       "UPDATE dbo.TblProfile " + 
       "SET " + 
        "Name = @name, " + 
        "Picture = @picture " + 
       "WHERE ID = @id"; 
      command.Parameters.AddWithValue("@name", Name); 
      command.Parameters.AddWithValue("@picture", Picture); 
      command.Parameters.AddWithValue("@id", Id); 
      command.ExecuteNonQuery(); 
     } 
    } 
}