C# winform DevExpress上传图片到数据库【转】

实现功能如下图:
实现功能
注明:此文使用的是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;
        }
posted on 2018-06-01 19:33  3D入魔  阅读(1873)  评论(0编辑  收藏  举报