• 数据库存储图像及使用Image控件显示


    在数据库中存取并显示到页面Image控件的功能。原来认为并不复杂,但是实际中却遇到了一些问题。

    首先来看看保存图片:

    图片在数据库中使用二进制方式存储,所以要把图片转化为二进制流文件在存储到数据库中,代码如下:

        private void Save()

        {

            MyImage img = new MyImage();

            img.Img = System.Drawing.Image.FromStream(this.FileUpload1.PostedFile.InputStream);

            System.IO.MemoryStream ms = new MemoryStream();

            img.Img.Save(ms, img.Img.RawFormat);

           

            SqlParameter[] paras = new SqlParameter[1];

            paras[0] = new SqlParameter("@img", SqlDbType.Image, 2147483647);

            paras[0].Value = ms.ToArray();

            sql.DBOption("Insert Into T_img (img) Values (@img)",paras);

    }

    再来看看读取文件:

        SqlDataAdapter adapter = new SqlDataAdapter("Select * From T_img Where imgID = " + Request.QueryString["imgID"].ToString(), sql.SqlConn);

        DataSet Ds = new DataSet();

        adapter.Fill(Ds);

        if (Ds.Tables[0].Rows.Count > 0)

        {

            img.ImgID = Convert.ToInt32(Ds.Tables[0].Rows[0]["imgID"]);

            Byte[] bytes = (Byte[])Ds.Tables[0].Rows[0]["img"];

            Response.BinaryWrite(bytes);

        }

    最后要将其在Image控件中显示:

    在网上看了很多资料都是使用Response.BinaryWrite(bytes),但是这只能重写页面,造成页面上只显示图片,但是在实际的项目中我们有可能是要显示在某一个特定的位置,或者说在System.Web.UI.WebControls.Image控件中显示。一开始我有一个误区,想将System.Drawing.Image对象放入WebControls.Image控件中,实际上是不能直接转换的。网上很多人提出了建立一个页面只显示图像,然后把这个页面的地址传给Image1.ImageUrl。这样做显然可以成功,但是有一点我不太满意,有一个多余的页面,此时可以使用HttpHandler来解决。

    Web.config文件中加入一个HttpHandler

    <system.web>

    <httpHandlers>

    <addverb="*"path="imgPage1.aspx"type="imgPageHandler"/>

    </httpHandlers>

    </system.web>

    App_Code里加入一个imgPageHandler类型,并使他继承自IHttpHandler,并重写IsReusable属性和ProcessRequest方法,代码如下:

        public bool IsReusable

         {

             get { return false; }

         }

     

         public void ProcessRequest(HttpContext context)

         {

             MyImage img = new MyImage();

             try

             {

                 sql.DBConnect();

                 SqlDataAdapter adapter = new SqlDataAdapter("Select * From T_img Where imgID = " + context.Request.QueryString["imgID"].ToString(), sql.SqlConn);

                 DataSet Ds = new DataSet();

                 adapter.Fill(Ds);

                 if (Ds.Tables[0].Rows.Count > 0)

                 {

                     img.ImgID = Convert.ToInt32(Ds.Tables[0].Rows[0]["imgID"]);

                     Byte[] bytes = (Byte[])Ds.Tables[0].Rows[0]["img"];

                     context.Response.BinaryWrite(bytes);

                 }

             }

             catch (Exception ex)

             {

                 throw ex;

             }

             finally

             {

                 sql.DBClose();

             }

         }

    在要显示图像的页面中将虚拟出的页面地址给Image1.ImageUrl

           this.Image1.ImageUrl = "imgPage1.aspx?imgID=" + this.TextBox1.Text;

  • 相关阅读:
    PHP-Resque 简介
    基于Redis的消息队列php-resque
    sms_queue 短信队列
    那些最好的轮子
    Sphinx高亮显示关键字
    atitit.系统托盘图标的设计java swing c# .net c++ js
    atitit.验证码识别step4--------图形二值化 灰度化
    atitit.验证码识别step3----去除边框---- 图像处理类库 attilax总结java版本
    atitit.验证码识别step2------剪贴板ClipBoard copy image图像 attilax总结
    atitit.loading的设计与实现控件选型attilax 总结
  • 原文地址:https://www.cnblogs.com/lzhdim/p/1345912.html
Copyright © 2020-2023  润新知