【问题标题】:Saving image to the database将图像保存到数据库
【发布时间】:2012-06-08 08:48:26
【问题描述】:

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

如果有人能指出正确的方向,如何将图像保存到数据库和相关实体将会很棒。

【问题讨论】:

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


【解决方案1】:

只是旁注:我认为将图像存储在 db 中不是一个好主意。

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

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

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

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

数据库设计

  • 在您的表中创建一个二进制列(binary 或 varbinary)
  • 最好在具有 1-1 关系的不同表中创建它。然而,这个想法是避免在水合实体时加载图像。仅在需要时才使用延迟加载方法加载图像。
  • 当您进行大选择时,您必须避免加载图像(例如,如果您想在一个组合中加载所有实体,请避免 SELECT * From 不管),因为它会加载数千张图像。正如我所说,这可以通过将图像放在不同的表中,或在 SELECT 中仅加载适当的列或通过延迟加载来完成。 (或者更好的是在数据库中没有图像,只有路径)

C# 代码

【讨论】:

  • 好的,我决定听从您的建议将图像存储在文件系统中。听起来好多了。我假设我需要参考相关实体创建另一个具有 id、name、path、desc 的实体 Photo?任何链接请或建议。
  • 我将编辑我的答案给你一些建议。顺便说一句,我不明白为什么有些人对你的问题投了反对票……
  • 我发布了另一个问题,将图像存储到文件系统 stackoverflow.com/questions/10946789/…
【解决方案2】:

代码是微不足道的,但为什么是数据库? 如果这是一个网站,为什么不将其保存到磁盘上可以轻松引用的位置?

数据库经过优化,可以存储已知大小和相对较小的数据。您的图像长度很可能超过 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();
        }
    }
}

【讨论】:

    【解决方案3】:

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

    Upload Image and Save in DB

    【讨论】:

      猜你喜欢
      • 2020-02-10
      • 2019-06-27
      • 1970-01-01
      • 1970-01-01
      • 2020-03-07
      • 2020-04-07
      相关资源
      最近更新 更多