数据库存储图片的方法及优缺点简析 (图片在数据库存储)

随着数据量的不断增加,数据库不仅仅存储纯文本数据,也存储着越来越多的多媒体数据,如图片、音频、视频等。其中,存储图片数据是比较常见的需求,这样做不仅方便数据管理,也能够提高数据的可用性。那么,数据库存储图片应该如何实现呢?本文将从方法和优缺点两个方面来简析这个问题。

数据库存储图片的方法

在数据库中存储图片,主要有两种方法:一种是将图片本身存储在数据库中,另一种是将图片的路径存储在数据库中,而将实际的图片存储在其它的存储设备中。

1. 将图片本身存储在数据库中

将图片本身存储在数据库中,可以采用 BLOB(Binary Large Object)类型的数据来存储。BLOB 是一种二进制大对象,它可以存储任何类型的数据,包括图像、文本、音频等等。BLOB 类型的数据可以通过 insert 或 update 等 SQL 语句来存储或修改。在 MySQL 中,BLOB 类型可以定义为 TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB 四种类型,它们分别可以存储 255 字节、65,535 字节、16,777,215 字节和 4G(2^32-1)字节大小的数据。

2. 将图片的路径存储在数据库中

将图片的路径存储在数据库中,可以采用 VARCHAR 或 TEXT 类型的数据来存储。VARCHAR 和 TEXT 类型都可以存储字符串数据,但它们的存储长度不同,VARCHAR 的长度通常为 1-255 字节,而 TEXT 的长度可以达到 65,535 字节(在某些数据库中,可以达到 4G)。将图片的路径存储在数据库中,主要是为了避免将大量的 BLOB 数据存储在数据库中导致数据库变得臃肿。

优缺点分析

1. 将图片本身存储在数据库中的优缺点

优点:

(1)实现起来简便,只需要在数据库中添加 BLOB 类型的字段就可以了。

(2)能够方便地进行备份和恢复,不需要额外的文件系统。

(3)数据管理更加方便,可以直接在数据库中进行操作。

缺点:

(1)导致数据库变得臃肿,占用大量的空间。

(2)查询图片数据时会影响数据库的性能,尤其是在高并发的情况下。

(3)数据库备份和恢复时间会很长,尤其是在数据量较大的情况下。

2. 将图片的路径存储在数据库中的优缺点

优点:

(1)避免了将大量的 BLOB 数据存储在数据库中导致数据库变得臃肿。

(2)查询图片数据时不会影响数据库的性能,因为只需要查询路径即可。

(3)能够方便地修改和维护图片,因为图片本身并不存储在数据库中。

缺点:

(1)需要额外的文件系统来存储实际的图片数据,增加了系统复杂性。

(2)备份和恢复时需要处理两个不同的数据源,需要花费更长的时间。

(3)如果图片路径指向的文件被删除或者修改了,数据库中的数据会出现问题。

结论

综上所述,将图片与其它二进制数据存储在数据库中,不是极好的方案。当然,具体用什么方法来存储图片,需要根据具体的业务需求和数据特性来考虑。在选择存储方案时,既要考虑数据的可维护性,也要考虑系统的效率和性能,需要权衡得当。

相关问题拓展阅读:

mysql数据库可以存图片吗

mysql数据库是可以存储图片的,操作方法:

1、具体的脚本代码如下,其中我们假定文件上传域的名称为Picture;

2、这样,我们就可以成功的把图片保散兄存到数饥掘档据库中。如果在将图片插入MySQL的过程中出现问题,可以检查一下

MySQL数据库

所允许的更大

数据包

的大小。如果设置值过小的话,我们会在数据库的错误日志中找到相应的记录;

3、提取图片方法:编写两个文件。其中,之一个文件作为HTML页面的模板,定位图片的显示位置。第二个文件则被用来从数据库中实际输出文件流,作为标签的SRC属性;

4、当HTML页面被浏览时,每显示一副图片就会调用一次Second.php3文件。当第二个文件被调用烂乱时会传入相应的Picture ID,我们可以借此从数据库中取回对应的图片并显示。

在设计到数据库的开发中,难免要将图片或音频文件插入到数据库中的情况。一般来说,我们可以同过插入图片文件相应的存储位置,而不是文件本身,来避免直接向数据库里插入的麻烦。但有些时候,向MySQL中插入图片更加容易管理。

可以。类型为blob类型

图片如何存入数据库

之一种方式:保存图片路径至数据库中瞎档

第二种方式漏行:数据插入相应表磨搜乱中,参数类型为byte

例如:

sql:insert into table(imageColumn) values (@image);

其中@image参数值为byte类型的变量

  通常对用户上传的图片需要保存到数据库中。解决方法一般有两种:一种是将图片保存的路径存储到数据库;另一种是将图片以

二进制

数据流的形式直接写入数据库字段中。以下为具体方法:

  一、保存图片的上传路径到数据库:

  string uppath=””;//用于保存图片上传路径

  //获取上传图片的文件名

  string fileFullname = this.FileUpload1.FileName;

  //获取图片上传的时间,以时间作为图片的名字可以防止图片重名

  string dataName = DateTime.Now.ToString(“yyyyMMddhhmmss”);

  //获取图片的文件名(不含

扩展名

  string fileName = fileFullname.Substring(fileFullname.LastIndexOf(“\\”) + 1);

  //获取图片扩展名

  string type = fileFullname.Substring(fileFullname.LastIndexOf(“.”) + 1);

  //判断是否为要求的格式

  if (type == “bmp” || type == “jpg” || type == “jpeg” || type == “gif” || type == “JPG” || type == “JPEG” || type == “BMP” || type == “GIF”)

  {

  //将图片上传到指定路径的

文件夹

  this.FileUpload1.SaveAs(Server.MapPath(“~/upload”) + “\\” + dataName + “.” + type);

  //将路径保存到变量,将该变量的值保存到数据库相丛埋拿应字段即可

  uppath = “~/upload/” + dataName + “.” + type;

  }

  二、将图片以二进制数据流直接保存到数据库:

  引用如下命名空间:

  using System.Drawing;

  using System.IO;

  using System.Data.SqlClient;

  设计数据库时,表中相应的字段类型为iamge

  保存:

  //图片路径

  string strPath = this.FileUpload1.PostedFile.FileName.ToString ();

  //读取图片

  FileStream fs = new System.IO.FileStream(strPath, FileMode.Open, FileAccess.Read);

  BinaryReader br = new BinaryReader(fs);

  byte photo = br.ReadBytes((int)fs.Length);

  br.Close();

  fs.Close();

  //存入

  SqlConnection myConn = new SqlConnection(“Data Source=.;Initial Catalog=stumanage;User ID=sa;Password=123”);

  string strComm = ” INSERT INTO stuInfo(stuid,stuimage) VALUES(107,@photoBinary )”;//操作数据库语句根据需要修改

 液樱 SqlCommand myComm = new SqlCommand(strComm, myConn);

  myComm.Parameters.Add(“@photoBinary”, SqlDbType.Binary, photo.Length);

  myComm.Parameters.Value = photo;

  myConn.Open();

  if (myComm.ExecuteNonQuery() >渗搭 0)

  {

  this.Label1.Text = “ok”;

  }

  myConn.Close();

  读取:

  …连接数据库

字符串

省略

  mycon.Open();

  SqlCommand command = new

  SqlCommand(“select stuimage from stuInfo where stuid=107”, mycon);//查询语句根据需要修改

  byte image = (byte)command.ExecuteScalar ();

  //指定从数据库读取出来的图片的保存路径及名字

  string strPath = “~/Upload/zhangsan.JPG”;

  string strPhotoPath = Server.MapPath(strPath);

  //按上面的路径与名字保存图片文件

  BinaryWriter bw = new BinaryWriter(File.Open(strPhotoPath,FileMode.OpenOrCreate));

  bw.Write(image);

  bw.Close();

  //显示图片

  this.Image1.ImageUrl = strPath;

  采用俩种方式可以根据实际需求灵活选择。

图片存入数据库,你说的是存放图片的二进制编码,数据库中知道为二进制,然后表单提交以二进制模式

怎样把图片存入SQL数据库表中??

可以将其转化为base64字符串,再存入数据库,页面解析时,再讲字符串解析为图片。

一、先来熟悉一下将要使用的对象方法:差如

用来获取上一个页面传 递过来的数据一般是使用Request对象。同样的,我们也可以使用Request对象 来获取上传上来的文件数据,使用的方法是Request.BinaryRead()。

要从数据库中读出来图片的数据显示到网页上面要用到的方法是:Request.BinaryWrite()。

二、在得到了图片的数据,要保存到数据库中的时候, 不可以直接使用Insert语句对数据库进行操作,而是要使用ADO的 AppendChunk方法。

同样的,读出数据库中的图片数据,要使用GetChunk方 法。

各个方法的具体语法如下: 

* Request.BinaryRead语法: 

variant = Request.BinaryRead(count) 

参数 

variant 

返回值

保存着从客户端读取到数据。 

count 

指明要从客户端读取的数据量大小,这个值小于或者等于使用方法 

Request.TotalBytes得到的数据量。 

* Request.BinaryWrite语法: 

Request.BinaryWrite data 

参数 

data 

要写入到客户端浏览器中的

数据包

。 

* Request.TotalBytes语法: 

variant = Request.TotalBytes 

参数 

variant 

返回从客户端读取到数据量的字节数。 

* AppendChunk语法 

将数据追加到大型文本、

二进制

数据 Field 或 Parameter 对象。 

object.AppendChunk Data 

参数 

object Field 或 Parameter 对象 

Data 变体型,包含追加到对象中的数据。 

说明 

使用 Field 或 Parameter 对象的 AppendChunk 方法可将长二进制或字符数 

据填写到对象中。在系统内存有限的情况下,可以使用 AppendChunk 方法对长 

整型值进行部分而非全部的操作。 

* GetChunk语法 

返回大型文本或二进制数据 Field 对象的全部或部分内容 。 

variable = field.GetChunk( Size ) 

返回值 

返回变体型。 

参数 

Size 

长整型

表达式,等于所要检索的字节或字符数。 

说明 

使用 Field 对象的 GetChunk 方法检索其部分或全部长二进制或字符数据。 

在系统内存有限的情况下,可使用 GetChunk 方法处理部分而非全部的长整型 

值。 

GetChunk 调用返回的数据将赋给“变量”。如果 Size 大于剩余的数据,则 

GetChunk 仅返回剩余的数据而无需用空白填充“变量”。如果字段为空,则 

GetChunk 方法返回 Null。 

每个后续的 GetChunk 调用将检索从前一次 GetChunk 调用停止处开始的数 

据。但是,如果从一个字段检索数据然后在当前记录中设置或读取另一个字段 

的值,ADO 将认为已从之一个字段中检索出数据。如果在之一个字段上再次调 

用 GetChunk 方法,ADO 将把调用解释为新的 GetChunk 操作并从记录的起始 

处开始读取。如果其他 Recordset 对象不是首个 Recordset 对象的副本,则 

访问其中的字段不会破坏 GetChunk 操作。 

如果 Field 对象的 Attributes 属性中的 adFldLong 位设置为 True,则可 

以对该字段使用 GetChunk 方法。 

如果在 Field 对象上使用 Getchunk 方法时没有当前记录,将产生错误 3021 

(无当前记录)。 

三、设计数据库,作为猛知测试的数据库结构如 下(Access97): 

字段名称    类型    描述

id    自动编号   主键值 

img OLE对象   用来保存图片数据  

对于在MS SQL Server7中,对应的结构如下: 

字段名称    类型    描述 

id     int(Identity) 主键值 

img   image     用来保存图片数据  

四、正式编写纯ASP代码上传部分了,首先,有一个提 供给用户的上传界面,可以让用户选择要上传的图片。代码如下 (upload.htm): 

 

 

 

 

 

 

 

 

 

 

注意代码中黑色斜体的部分,一定要在Form中有这个属性,否则,将无 

法得到上传上来的数据。 

五、接下来,要在process.asp中对从浏览器中获取的数据进行必要的处 理,因为在process.asp中获取到的数据不仅仅包含了想要的上传上来的图片的数据,也包含了其他的无用的信息,需要剔除冗余数据,并将处理过的图片数据保存到数据库中,这里以Access97为例。具体代 码如下(process.asp): 

 

六、这样就把上传来的图片保存到了名为images.mdb的数据库中 了,剩下的工作就是要将数据库中的图片数据显示到网页上面了。

一般在HT ML中,显示图片都是使用标签,也就是,但是图片是保存到了数据库中,“图片路径”是什么呢?呵呵,其实这个 SRC属性除了指定路径外,也可以这样使用哦: 

 

所以,要做的就是在showimg.asp中从数据库中读出来符合条件的 数据,并返回到SRC属性中就可以了,具体代码如下(showimg.asp): 

 

七、注意在输出到浏览器之前一定要指Response.ContentType = “image/*”, 以便正常显示图片。 最后要注意的地方是,我的process.asp中作的处理没有考虑到之一页 (upload.htm)中还有其他数据,比如等等,如果 有这些项目,process.asp就要注意处理掉不必要的数据。 

问题有点不清楚,如果你说的是指把图片文件数据存入数据库中可以这岩宏样做:

首先在表里设置一个列为byte类型。

然后是实例化一个图片文件对象:

File file = new File(“参数为图片路径比如:E:/java/chart.jpg”);

然后将对象转成流:

FileInputStream fis = new FileInputStream(file);

使用PreparedStatement 对象进行插入操作。

PreparedStatement ps = conn(数据库连接对象).prepareStatement(“SQL语句:如:Insert into gs_img (img) values (?)”);

接下粗薯册来就是最关键的一步,在使手散用PreparedStatement类的setBinaryStream()方法。

这个方法有三个参数:之一个就是列的检索,也就是字段名在SQL语句中的序号,

第二个参数是流对象,第三个参数是流的长度。

也就是ps.setBinaryStream(3,fis,(int)file.length());

最后执行SQL语句:ps.executeUpdate();

可以用数据类型设置为image

但是本人认为存储图片到数据库里塌启,有点慢,本人实际一般都是把图片扮衫昌复制到一个公共文件夹里,然后按照一定规则起名字,再把存储路径保存到数据库里,调用的时候把路径给图片控件给他就可以了厅扒,感觉能快点

只是个人想法

将图片存入SQL数据库中一般分两种情况

一、 把图片转换成二进制形式存储在数据库中

一般数据库提供一个二进制字段来存储二进制数据。如SQL Server中的BINARY,VARBINARY;

1、BINARY 数据类型用于存储二进制数据。其定义形式为BINARY( n), n 表示数据的长度,取值为1 到8000 。在使用时必须指定BINARY 类型数据的大小,至少应为1 个字节。BINARY 类型数据占用n+4 个字节的存储空间。在输入数据时必须在数据前加上字符“0X” 作为二进制标识,如:要输入“abc ”则应输入“0xabc ”。若输入的数据过长将会截掉其超出部分。若输入的数据位数为奇数,则会在起始符号“0X ”后添加一个0,如上启迟述的“0xabc ”会被系统自动变为“0x0abc”。

2、VARBINARY数据类型的定义悄仿李形式为VARBINARY(n)。 它与BINARY 类型相似,n 的取值也为1 到8000, 若输入的数据过长,将会截掉其超出部分。不同的是VARBINARY数据类型具有变动长度的特性,因为VARBINARY数据类型的存储长度为实际数值长度+4个字节。当BINARY数据类型允许NULL 值时,将被视为VARBINARY数据类型。

一般情况下,由于BINARY 数据类型长度固定,因此它比VARBINARY 类型的处理速度快

二、 图片存储在磁盘上,数据库字段中保存的是图片的路径

存储路径存储路径字符串即可,sql中可以使用varchar/nvarchar;

总结:将图片文件直接以二进制存储数据库需要将图片提前转为二进制数大态据,以存储图片物理路径的方式需要将图片文件放置指定位置,这都需要配合不同的编程语言实现;

以C#为例:

//点击按钮执行存入

private void btnWrite_Click(object sender, EventArgs e)

{

OpenFileDialog ofd = new OpenFileDialog();

ofd.Filter = “*jpg|*.JPG|*.GIF|*.GIF|*.BMP|*.BMP”;

if (ofd.ShowDialog() == DialogResult.OK)

{

  string filePath = ofd.FileName;//图片路径

  FileStream fs = new FileStream(filePath, FileMode.Open);//读取图片流

  byte imageBytes = new byte;

  BinaryReader br = new BinaryReader(fs);

  imageBytes = br.ReadBytes(Convert.ToInt32(fs.Length));//图片转换成二进制流

  string strSql = string.Format(“insert into .. (, ) values (@image,’2′)”);

  int count = Write(strSql,imageBytes );

  if (count > 0)

  {

      MessageBox.Show(“success”);

  }

  else

  {

      MessageBox.Show(“failed”);

  }

}

}

//数据库连接和保存图片语句

private int Write(string strSql,byte imageBytes)

{

string connStr = “Data Source=数据库地址;initial Catalog=SBS;User ID=sa;Password=sa;”;

using (SqlConnection conn = new SqlConnection(connStr))

{

  using (SqlCommand cmd = new SqlCommand(strSql, conn))

  {

      try

      {

conn.Open();//打开数据库链接

SqlParameter sqlParameter = new SqlParameter(“@image”, SqlDbType.Image);

sqlParameter.Value = imageBytes;

cmd.Parameters.Add(sqlParameter);

int rows = cmd.ExecuteNonQuery();//执行插入操作

return rows;

      }

      catch (Exception e)

      {

throw;

      }

  }

}

图片在数据库存储的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于图片在数据库存储,数据库存储图片的方法及优缺点简析,mysql数据库可以存图片吗,图片如何存入数据库,怎样把图片存入SQL数据库表中??的信息别忘了在本站进行查找喔。


数据运维技术 » 数据库存储图片的方法及优缺点简析 (图片在数据库存储)