ASP.NET,将图片保存在Oracle数据库中的CLOB字段中。
思路:先获取图片的二进制数据,然后转化为十六进制,直接当做string类型,保存到clob字段;显示图片时,从clob字段中取出string类型的十六进制数据,然后转换为二进制,最后直接将byte数组数据输出到页面即可显示图片。
关键代码:
图片上传页面 SavePhoto.aspx :
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table>
<tr>
<td width="100" align="right">
照片:
</td>
<td width="400">
<asp:FileUpload ID="filePhoto" runat="server" />
<asp:Button ID="btnSave" runat="server" Text="Save" οnclick="btnSave_Click" />
</td>
<td width="100" align="right" >
</td>
<td width="400">
<img id="checkimg" name="checkimg" width="90" height="106" src="image.aspx?REC_ID=<%=REC_ID %>"
alt="图片" />
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
对应 SavePhoto.cs 代码:
public partial class SavePhoto : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
/// <summary>
/// 保存图片
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnSave_Click(object sender, EventArgs e)
{
string photo="";
if (filePhoto.HasFile)
{
byte[] fileBytePicture = new byte[filePhoto.PostedFile.ContentLength];//用图片的长度来初始化一个字节数组存储临时的图片文件
System.IO.Stream fileStream = filePhoto.PostedFile.InputStream;//建立文件流对象
fileStream.Read(fileBytePicture, 0, filePhoto.PostedFile.ContentLength);
photo = ByteToString(fileBytePicture);
}
string err;
int result =UpdateItem(photo,out err);
if (result != 0)
{
Response.Write("<script>alert('修改成功。');</script>");
}
else
{
Response.Write("<script>alert('修改失败。');</script>");
}
}
/// <summary>
/// 保存照片到数据库
/// </summary>
/// <param name="sql"></param>
private int UpdateItem(string photo,out string err)
{
err = null;
string connStr = "Data Source=Test;Persist Security Info=True;User ID=Test;Password=123;Unicode=True";
//先在项目中,添加System.Data.OracleClient;引用
OracleConnection con = new OracleConnection(connStr);
try
{
con.Open();
OracleParameter para= new OracleParameter(":PHOTO", photo);
OracleCommand cmd = new OracleCommand();
cmd.Connection = con;
cmd.CommandText = "insert into Test(ID,PHOTO) values(1,:PHOTO)";
cmd.Parameters.Add(para);
return cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
err = ex.Message;
return 0;
}
finally
{
con.Close();
}
}
/// <summary>
/// 将byte数组转为string类型
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
public string ByteToString(byte[] bytes)
{
StringBuilder strBuilder = new StringBuilder();
foreach (byte bt in bytes)
{
strBuilder.AppendFormat("{0:X2}", bt);
}
return strBuilder.ToString();
}
}
图片显示页面 :image.aspx
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
是的,前台页面啥也没有
后台 image.cs
public partial class image : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string photo = GetPhoto();
if (photo == "")
{
Response.Write("");
}
else
{
Response.BinaryWrite(StringToByte(photo));//直接将二进制数组数据输出到页面,即可显示图片
}
}
}
/// <summary>
/// 获取图片的十六进制数据
/// </summary>
/// <returns></returns>
private string GetPhoto()
{
string sql = "select photo from test where id=" + Request.Params["id"];
string error;
DataTable dt = GetList(sql, out error);//GetList 为从Oracles数据库中取数据的方法,此处省略
if (string.IsNullOrEmpty(error))
{
return dt.Rows[0][0].ToString();
}
else
{
return "";
}
}
/// <summary>
/// 将string转为byte数组
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public byte[] StringToByte(string str)
{
byte[] bytes = new byte[str.Length / 2];
for (int i = 0; i < str.Length / 2; i++)
{
int btvalue = Convert.ToInt32(str.Substring(i * 2, 2), 16);
bytes[i] = (byte)btvalue;
}
return bytes;
}
}