1. 程式人生 > >C# winform DevExpress上傳圖片到數據庫【轉】

C# winform DevExpress上傳圖片到數據庫【轉】

選擇圖片 filter 技術 filepath iss 二進制格式 img 變量 HERE

實現功能如下圖:
技術分享圖片
註明:此文使用的是DevExpress控件,winform 原生控件也是一樣使用方法。

1.點擊選擇圖片按鈕,功能為通過對話框選擇要上傳的文件,並將該文件在下面的PictureEdit中顯示出來。具體代碼如下:

private void btnChoosePic_Click(object sender, EventArgs e)
        {
            ShowPic(pictureEdit1);
        }

        /// <summary>
        /// 選擇圖片
        /// </summary>
        /// <param name="picEdit"></param>
        public static void ShowPic(PictureEdit picEdit)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.InitialDirectory = @"C:\";
            ofd.Filter = "Image Files(*.JPG;*.PNG;*.jpeg;*.GIF;*.BMP)|*.JPG;*.PNG;*.GIF;*.BMP;*.jpeg|All files(*.*)|*.*";
            ofd.RestoreDirectory = true;
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                PicAddress = ofd.FileName;
                Image imge = Image.FromFile(PicAddress);
                Bitmap bm = new Bitmap(imge, picEdit.Width, picEdit.Height);
                picEdit.Image = bm;
            }
        }

ShowPic()方法為靜態方法,可以直接調用,其中的PicAddress變量為靜態全局變量,用於記錄要上傳文件的文件地址。PictureEdit顯示圖片的方式,是通過PictureEdit的image屬性設定的,將圖片轉成Bitmap格式,位圖文件是最簡單的圖片格式。

2.上傳圖片,該按鈕的功能是將選定的圖片上傳到數據庫中,具體的實現代碼如下:

/// <summary>
        /// 上傳圖片
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnUploadPic_Click(object sender, EventArgs e)
        {
            if (PicAddress != null)
            {
                if (PicType.Equals("教師"))
                {
                    var sqlSearch =
                        $@"select count(*) from studentmanager.picture where PicTypeId = ‘{TeacherId}‘
                                                            and PicType=‘{PicType}‘";
                    var dsSearch = _db.GetResult(sqlSearch);
                    if (dsSearch.Tables[0].Rows[0][0].ToString().Equals("0")) //沒有重復的,則進行新增插入操作
                    {
                        byte[] pic = CommonFunction.GetContent(PicAddress);
                        var result = _db.SavePictureToDB(pic, PicAddress, PicType, TeacherId);
                        if (result > 0)
                        {
                            CommonFunction.MessageShow("頭像添加成功", "提示", "OK", "Information");
                            DialogResult = DialogResult.OK;
                        }
                        else
                        {
                            CommonFunction.MessageShow("頭像添加失敗");
                        }
                    }
                    else
                    {
                        //更新頭像
                        if (PicAddress.Equals(String.Empty))
                        {
                            CommonFunction.MessageShow("沒有重新選擇圖片進行更新");
                            return;
                        }
                        byte[] pic = CommonFunction.GetContent(PicAddress);
                        var result = _db.UpdatePictureToDb(pic, PicAddress, PicType, TeacherId);
                        if (result > 0)
                        {
                            CommonFunction.MessageShow("頭像更新成功", "提示", "OK", "Information");
                            DialogResult = DialogResult.OK;
                        }
                        else
                        {
                            CommonFunction.MessageShow("頭像更新失敗");
                        }
                    }
                }
                else if(PicType.Equals("學生"))
                {
                    var sqlSearch =
                        $@"select count(*) from studentmanager.picture where PicTypeId = ‘{StudentId}‘
                                                            and PicType=‘{PicType}‘";
                    var dsSearch = _db.GetResult(sqlSearch);
                    if (dsSearch.Tables[0].Rows[0][0].ToString().Equals("0")) //沒有重復的,則進行新增插入操作
                    {
                        byte[] pic = CommonFunction.GetContent(PicAddress);
                        var result = _db.SavePictureToDB(pic, PicAddress, PicType, StudentId);
                        if (result > 0)
                        {
                            CommonFunction.MessageShow("頭像添加成功", "提示", "OK", "Information");
                            DialogResult = DialogResult.OK;
                        }
                        else
                        {
                            CommonFunction.MessageShow("頭像添加失敗");
                        }
                    }
                    else
                    {
                        //更新頭像
                        if (PicAddress.Equals(String.Empty))
                        {
                            CommonFunction.MessageShow("沒有重新選擇圖片進行更新");
                            return;
                        }
                        byte[] pic = CommonFunction.GetContent(PicAddress);
                        var result = _db.UpdatePictureToDb(pic, PicAddress, PicType, StudentId);
                        if (result > 0)
                        {
                            CommonFunction.MessageShow("頭像更新成功", "提示", "OK", "Information");
                            DialogResult = DialogResult.OK;
                        }
                        else
                        {
                            CommonFunction.MessageShow("頭像更新失敗");
                        }
                    }
                }
            }
            else
            {
                CommonFunction.MessageShow("請先選擇圖片!", "提示", "OK", "Error");
            }
        }

上傳的過程大概就是:根據文件地址將對應文件轉換成數據流二進制格式–>編寫對應的SQL語句–>執行該SQL語句,將圖片添加到數據庫中。
上面代碼中SavePictureToDB方法代碼如下:

/// <summary>
        /// 保存圖片到數據庫
        /// </summary>
        /// <param name="imageByte"></param>
        /// <param name="Tablename"></param>
        /// <param name="FieldPicturename"></param>
        /// <param name="FieldIdxname"></param>
        /// <param name="FieldIdxvalue"></param>
        /// <returns></returns>
        public int SavePictureToDB(byte[] imageByte,
            string Picturename,
            string PicType,
            int PicTypeId)
        {
            var result = 0;
            try
            {
                if (imageByte != null && imageByte.Length != 0)
                {
                    using (var conn = new MySqlConnection())
                    {
                        conn.ConnectionString = ConnectionString;
                        conn.Open();

                        var insertStr = @"INSERT INTO studentmanager.picture 
                                                    (
                                                    Picturename, 
                                                    PicType, 
                                                    PicTypeId, 
                                                    imageByte
                                                    )
                                                    VALUES
                                                    (
                                                    @Picturename, 
                                                    @PicType, 
                                                    @PicTypeId, 
                                                    @imageByte
                                                    );";
                        var comm = new MySqlCommand();
                        comm.Connection = conn;
                        comm.CommandText = insertStr;
                        comm.CommandType = CommandType.Text;

                        //設置數據庫字段類型MediumBlob的值為圖片字節數組imageByte
                        comm.Parameters.Add(new MySqlParameter("@imageByte", MySqlDbType.MediumBlob)).Value = imageByte;
                        comm.Parameters.Add(new MySqlParameter("@Picturename", MySqlDbType.VarChar)).Value = Picturename;
                        comm.Parameters.Add(new MySqlParameter("@PicType", MySqlDbType.VarChar)).Value = PicType;
                        comm.Parameters.Add(new MySqlParameter("@PicTypeId", MySqlDbType.Int32)).Value = PicTypeId;
                        //execute sql
                        result = comm.ExecuteNonQuery();

                        comm.Dispose();
                        conn.Close();
                        conn.Dispose();
                    }
                }
            }
            catch (Exception)
            {
                // throw ex;
            }
            return result;
        }

3.加載圖片顯示到PictureEdit;

/// <summary>
        /// 窗口加載
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void HeadManager_Load(object sender, EventArgs e)
        {
            LoadImage(PicType, PicType.Equals("教師") ? TeacherId : StudentId);
        }

        /// <summary>
        /// 獲取圖片
        /// </summary>
        /// <param name="picType"></param>
        /// <param name="picTypeid"></param>
        private void LoadImage(string picType, int picTypeid)
        {
            try
            {
                var imageBytes = _db.GetImage(picType, picTypeid);
                var image = CommonFunction.GetImageByBytes(imageBytes);
                Bitmap bm = new Bitmap(image, pictureEdit1.Width, pictureEdit1.Height);
                pictureEdit1.Image = bm;
            }
            catch (Exception)
            {
                pictureEdit1.Image = Resource.DefaultUser;
            }
        }

4.用到的公共方法:

/// <summary>
        /// 轉換為Byte[]
        /// </summary>
        /// <param name="filepath"></param>
        /// <returns></returns>
        public static byte[] GetContent(string filepath)//將指定路徑下的文件轉換成二進制代碼,用於傳輸到數據庫
        {
            FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);
            byte[] byData = new byte[fs.Length];//新建用於保存文件流的字節數組
            fs.Read(byData, 0, byData.Length);//讀取文件流
            fs.Close();
            return byData;
        }

        /// <summary>
        /// 讀取byte[]並轉化為圖片
        /// </summary>
        /// <param name="bytes">byte[]</param>
        /// <returns>Image</returns>
        public static Image GetImageByBytes(byte[] bytes)
        {
            Image photo;
            using (MemoryStream ms = new MemoryStream(bytes))
            {
                ms.Write(bytes, 0, bytes.Length);
                photo = Image.FromStream(ms, true);
                ms.Dispose();
                ms.Close();
            }
            return photo;
        }

C# winform DevExpress上傳圖片到數據庫【轉】