将图像保存到数据库

时间:2012-06-08 08:48:26

标签: c# sql-server asp.net-mvc-3 image

我有一些简单的实体,现在需要有一个个人资料图片。这样做的正确方法是什么?因此,它是1对1关系,一个图像仅与一个实体相关,反之亦然。该图像应通过webform与插入相关实体一起上传。

如果有人能指出我正确的方向如何将图像持久保存到数据库和相关实体将是伟大的。

3 个答案:

答案 0 :(得分:5)

只是一个侧面评论:我认为在db 中存储图像不是一个好主意。

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

如果你想拥有图像路径,你应该遵循一些指导原则(一般代码是防御性的):

  • 上传图像时检查图像是否有效(甚至对图像标题进行二元检查)
  • 在INSERT新实体的情况下,不允许覆盖现有图像。
  • 将图像命名为主键(1.jpg,2.jpg)
  • 在加载图像时,不要假设图像会在那里。
  • 不允许(如果可能)手动与图像交互(无需在机器中进行远程处理以及将图像从一个地方复制到另一个地方)。手动交互可能会导致不一致。

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

数据库设计

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

C#代码

答案 1 :(得分: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();
        }
    }
}

答案 2 :(得分:0)

我认为以下链接可以为您提供解决方案,

Upload Image and Save in DB