ASP.NET 在Oracle中CLOB字段中保存并读取图片

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;
        }
    }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值