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" onclick="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(); } }
<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; } }