最近需要用Oracle数据库保存图片,于是进行了一下研究。其实不管是文档、图片、还是视频,这些都属于非结构化数据,保存的关键在转换类型,下面进行总结。
1.在数据库表中建立一个LOB类型的字段,这种类型是专门用来保存图片等非结构化数据的,Oracle和SQL Server等大型数据库都支持这样的类型。
具体类型可能会有若干种,Oralcle支持BLOB、CLOB、NCLOB、BFILE,BLOB是二进制型大对象,CLOB和NCLOB都是字符型大对象,BFILE只存储文件指针,实际的文件是存储在文件系统中的。一般采用BLOB,它支持最大4G的数据。
2.在程序中将图片转化成字节数组。例如:
MemoryStream mstream = new MemoryStream();
image.Save(mstream, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] imageData = mstream.ToArray();
3.用SQL语句进行操作,方法和普通字段类似,只是在要指定字段内容的时候采用参数,将字节数组通过参数传入。例如:
CREATE TABLE table(ID NUMBER(3), PHOTO BLOB)
INSERT INTO table(ID,PHOTO) VALUES('1', :Photo)
:PHOTO是参数,注意这是在Oracle中的写法,在SQL Server中应该是@PHOTO。
4.取出图像的时候只要将object强制转化为字节数组,再转化为图像即可。例如:
MemoryStream mstream = new MemoryStream((byte[])imageData);
Image image=Image.FromStream(mstream);
其实对BLOB的操作也可以利用.Net的相关类库,不过我没用过,在此不表。
1.将Image图像文件存入到数据库中
我们知道数据库里的Image类型的数据是"二进制数据",因此必须将图像文件转换成字节数组才能存入数据库中.要这里有关数据的操作略写,我将一些代码段写成方法,方便直接调用.
//根据文件名(完全路径)
public byte[] SetImageToByteArray(string fileName)
{
FileStream fs = new FileStream(fileName, FileMode.Open);
int streamLength = (int)fs.Length;
byte[] image = new byte[streamLength];
fs.Read(image, 0, streamLength);
fs.Close();
return image;
}
//另外,在ASP.NET中通过FileUpload控件得到的图像文件可以通过以下方法
public byte[] SetImageToByteArray(FileUpload FileUpload1)
{
Stream stream = FileUpload1.PostedFile.InputStream;
byte[] photo = new byte[FileUpload1.PostedFile.ContentLength];
stream.Read(photo, 0, FileUpload1.PostedFile.ContentLength);
stream.Close();
return photo;
}
2.从SQL Server数据库读取Image类型的数据,并转换成bytes[]或Image图像文件
//要使用SqlDataReader要加载using System.Da
//将数据库中的Image类型转换成byte[]
public byte[] SetImage(SqlDataReader reader)
{
return (byte[])reader["Image"];//Image为数据库中存放Image类型字段
}
//将byte[]转换成Image图像类型
//加载以下命名空间using System.Drawing;/using System.IO;
using System.Da
public Image SetByteToImage(byte[] mybyte)
{
Image image;
MemoryStream mymemorystream = new MemoryStream(mybyte,0, mybyte.Length);
image = Image.FromStream(mymemorystream);
return image;
}