在Oracle中处理文件存储的方式是使用它自身的称为Orcale大对象内的类型也就是Oracle LOB 大对象
LOB对象有4种类型分别为:
由于要存储图片可以使用blob将图片保存为二进制格式,在这里本人使用了clob类型保存了图片的base64编码。
在保存过程中遇到的最大难题是如何将图片的base64编码保存进数据库的clob类型字段上。在这里提供一种方案,可能并不是绝对的,只是本人用它实现了这个功能。
需要在程序中导入操作Oracle数据库的名称空间,这里用的是System.Data.OracleClient,它的程序集是System.Data.OracleClient
先在数据库中创建一个存储表
create clob_table(
clob_id number(2) primary key not null,
clob_pic clob not null
)
然后执行C#代码 关键代码如下
string execSql="insert into clob_table(clob_id,) values(1,:clob_pic);"
这里使用参数化查询的方式 为了可以在为“OracleCommand” 添加参数时方便 使用了数组 关键代码如下
OracleParameter[] parameter = new OracleParameter[] { new OracleParameter(":clob_pic", OracleType.Clob) };
parameter[0].Value = 要保存的值;
如果是要查询的话
使用DataTable真接取值即可如
dt.Rows[0]["CLOB_PIC"]
另外
由于数据库图片存储采用的是base64编码 所以在显示图片的时候要将图片输出到浏览器流中
本人采用的是页面标签的src属性链接到一个一般处理程序,由这个一般处理程序来进行浏览器端的图片流输出(这有点类型于 验证码) 关键代码如下
string base64Str =获得数据库中存储的图片转码值
byte[] buffurPic = Convert.FromBase64String(base64Str);//获得byte数组值
context.Response.ContentType = "image/jpeg";//设置输出流类型
context.Response.Clear();
context.Response.BufferOutput = true;
context.Response.OutputStream.Write(buffurPic, 0, buffurPic.Length);
context.Response.Flush();
这里如果存储的是二进制那么不需要转换格式直接输出
图片转二进制 代码如下
FileStream fs = new FileStream(图片路径, FileMode.Open, FileAccess.Read);
byte[] buffur = new byte[fs.Length];
fs.Read(buffur, 0, (int)fs.Length);
图片转base64 过程是先将图片转成二进制然后再转base64 代码如下
FileStream fs = new FileStream(图片路径, FileMode.Open, FileAccess.Read);
byte[] buffur = new byte[fs.Length];
fs.Read(buffur, 0, (int)fs.Length);
string base64Str = Convert.ToBase64String(buffur);
其中base64Str即为转换的base64编码。
注:部分参考其他文章