C# 将图像保存到数据库
我有一些简单的实体,现在需要有一个配置文件图像。正确的方法是什么?因此,它是1对1关系,一个图像只与一个实体相关,反之亦然。此图像应通过webform上传,并插入相关实体C# 将图像保存到数据库,c#,sql-server,asp.net-mvc-3,image,C#,Sql Server,Asp.net Mvc 3,Image,我有一些简单的实体,现在需要有一个配置文件图像。正确的方法是什么?因此,它是1对1关系,一个图像只与一个实体相关,反之亦然。此图像应通过webform上传,并插入相关实体 如果有人能给我指出正确的方向,如何将图像持久化到数据库和相关实体将会非常好 我想下面的链接会为您提供解决方案 代码很简单,但为什么要使用DB? 如果这是一个网站,为什么不将其保存到磁盘上一个您可以轻松引用它的位置 数据库经过优化以存储已知大小和相对较小大小的数据。您的图像很可能会超过8KB,这意味着它是一个最大数据类型。 图像
如果有人能给我指出正确的方向,如何将图像持久化到数据库和相关实体将会非常好 我想下面的链接会为您提供解决方案
代码很简单,但为什么要使用DB? 如果这是一个网站,为什么不将其保存到磁盘上一个您可以轻松引用它的位置 数据库经过优化以存储已知大小和相对较小大小的数据。您的图像很可能会超过8KB,这意味着它是一个最大数据类型。 图像将存储在您的个人资料的单独行/页上 就我个人而言,我会将图像保存在一个已知的文件夹中,并使用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();
}
}
}
只是一个旁白:我认为在db中存储图像不是一个好主意
一般来说,在db中存储图像不是一个好主意,因为dbs设计用于存储文本,而不是大的二进制块。最好是存储图像路径并将图像保存在文件夹中。如果您想确定ID为实体1323.jpg的1对1关系名称映像
如果您想拥有映像路径,则应遵循通用代码中的一些指导原则:
上传图像时,检查图像是否有效,甚至对图像标题进行二进制检查
不允许在插入新实体时覆盖现有图像。
将图像命名为主键1.jpg、2.jpg
在加载图像时,不要假设图像会出现在那里。
如果可能,不允许与图像进行手动交互,不允许在机器中进行远程处理,也不允许将图像从一个位置复制到另一个位置。手动交互可能导致不一致。
但我认为出于某种原因你应该这么做。因此,为了实现您的目标:
数据库设计
在表中创建二进制列binary或varbinary
如果您在具有1-1关系的其他表中创建它,效果会更好。然而,这个想法是避免在水合实体时加载图像。使用延迟加载方法仅在需要时加载图像。
当你做一个大的选择时,你必须避免加载图像。例如,如果你想在一个组合中加载你的所有实体,避免从任何地方选择,因为它将免费加载数千个图像。正如我所说的,这可以通过将图像放在不同的表中,或者在SELECT中只加载适当的列,或者进行延迟加载来实现。甚至更好的方法是在DB中没有图像,只有路径
C代码
使用BynaryReader阅读它
用于存储它的用户字节数组
检查此链接以获取代码示例:
好的,我决定按照你的建议在文件系统中存储图像。这主意听起来好多了。我假设我需要创建另一个实体照片,其中包含id、名称、路径、描述以及相关实体?任何链接请或sugg。我将编辑我的答案给你一些建议。顺便说一句,我不明白为什么有些人对你的问题投了否决票……我发布了另一个问题来将图像存储到文件系统中,看看为什么这个问题被否决了?当我对一个问题投反对票时,我会发表评论解释为什么。。。