1. 程式人生 > >mysql儲存和讀取圖片

mysql儲存和讀取圖片

    首先,介紹一下mysql相關的資料型別:MySQL中有四種BLOB型別,TinyBlob(最大255Byte), Blob(最大65K), MediunBlob(16M), LongBlob(最大4G)。這裡注意一下如果你資料庫出現相關的Data too long...字樣可能是你選擇的種類的大小不夠。

    接下來簡單說一下我為什麼沒有用儲存圖片路徑的方式,而採取了直接在MySQL中儲存圖片的方式。原因有兩點:

    1、本身不需要大量圖片,一個數據庫只需要一張圖片

    2、軟體結構是要通過WebService由一個主客戶端去訪問下面附屬的幾個客戶端,如果附屬客戶端不儲存圖片直接供主客戶端訪問,那麼主客戶端勢必就需要一個載入圖片的功能(類似於FTP的功能

)。

    下面還是直接上程式碼吧:

       public bool MapSearchWrite(string strImagePath)
        {
            //將圖片轉換成緩衝流
            FileStream fs = new FileStream(strImagePath, FileMode.Open, FileAccess.Read);
            
            //獲得圖片的位元組陣列
            byte[] byImage = new byte[fs.Length];
            fs.Read(byImage, 0, byImage.Length);
            fs.Close();


            //資料庫連線
            MySqlConnection conn = new MySqlConnection();
            conn.ConnectionString = "Server=localhost;Uid=root;Password=123456;Database=firefighting;charset=gb2312";
            try
            {
                conn.Open();
            }
            catch
            {
                conn.Close();
                conn.Dispose();
                throw new ArgumentException("地圖檢索資料庫連線失敗");
            }


            //判斷資料庫內部有無記錄
            string strQueryCmd = "select PicNum from images";
            MySqlCommand cmdQuery = new MySqlCommand(strQueryCmd, conn);
            MySqlDataReader dataReader = cmdQuery.ExecuteReader();


            //執行操作
            MySqlCommand cmd = new MySqlCommand();
            if (dataReader.Read())
            {
                cmd.CommandText = "update images set

[email protected]";
            }
            else
            {
                cmd.CommandText = "insert into images(Image) values(@byImage)";
            }
          
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add("@byImage", MySqlDbType.MediumBlob);
            cmd.Parameters[0].Value = byImage;
            cmd.Connection = conn;
         
            int affectedRows = 0;
            try
            {
                affectedRows = cmd.ExecuteNonQuery();
            }
            catch
            {
                affectedRows = -1;
            }


            //關閉連線等
            cmd.Dispose();
            conn.Close();
            conn.Dispose();


            if (affectedRows <= 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

    這是把圖片插入到資料庫的操作程式碼,路徑的話就是你所需要儲存的圖片所在的路徑(包括圖片的名字和字尾名哦),另外我這裡採用的是ADO.NET的連線方式,語言是C#的,其他程式碼也不用我解釋了......

    下面是讀取MySQL中的圖片的程式碼

  public void MapSearchQuery(out byte[] imageByteResulet)
        {
            imageByteResulet = null;

            MySqlConnection conn = new MySqlConnection();
            conn.ConnectionString = "Server=localhost;Uid=root;Password=123456;Database=firefighting;charset=gb2312";
            try
            {
                conn.Open();
            }
            catch
            {
                conn.Close();
                conn.Dispose();
                throw new ArgumentException("地圖檢索資料庫連線失敗");
            }


            string strQueryCmd = "select Image from images limit 1";
            MySqlCommand cmd = new MySqlCommand(strQueryCmd, conn);
            MySqlDataReader dataReader = null;
            try
            {
                dataReader = cmd.ExecuteReader();
            }
            catch
            {
                dataReader.Dispose();
                cmd.Dispose();
                conn.Close();
                conn.Dispose();
                throw new ArgumentException("地圖檢索查詢地圖失敗");
            }


            if (dataReader.Read())
            {
                imageByteResulet = new byte[dataReader.GetBytes(0, 0, null, 0, int.MaxValue)];
                dataReader.GetBytes(0, 0, imageByteResulet, 0, imageByteResulet.Length);

                //將圖片位元組陣列載入入到緩衝流
                // MemoryStream imageStream = new MemoryStream(imageByte);

                //從緩衝流生成圖片
                //imageResulet = Image.FromStream(imageStream, true);
            }

            dataReader.Dispose();
            cmd.Dispose();
            conn.Close();
            conn.Dispose();
        }

    當然這裡我是照顧到Image物件不能通過WebService傳輸而把BLOB資料只轉換成byte[]在傳輸,如果不需要這個功能的換可以直接把相關程式碼踢出來再將byte[]轉成圖片物件即可,一下提供兩種方法

第一種:imageByte是呼叫上面函式得到的byte[]的資料

    //將圖片位元組陣列載入入到緩衝流
                 MemoryStream imageStream = new MemoryStream(imageByte);


                //從緩衝流生成圖片
                imageResulet = Image.FromStream(imageStream, true);

                //pictureBox是一個顯示圖片或者視訊的C#控制元件

                pictureBox.Image = imageResulet;

這樣就把圖片讀取出來並顯示出來了

第二種:BitMap是System.Drawingm名稱空間中的

Bitmap bm = new Bitmap(new MemoryStream(imageByte));
           
     pictureBox1.Image = bm;

那麼,到此我就說完了,當然不是迫不得已不要把圖片存到資料庫中,可以做個url對映,返回檔案流(這個目前沒試過,有時間試過後再把經驗分享給大家)。