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

原文地址:https://www.cnblogs.com/mazhenyu/p/9123183.html

时间: 2024-08-08 09:05:38

C# winform DevExpress上传图片到数据库【转】的相关文章

[WinForm][DevExpress]自定义GridControl中按钮文字内容

最近项目开发中,使用到了GridControl的FindPanel,这样可以很好的对数据进行筛选,可是所展现的按钮文字是英文,如图: 那怎么定义两个按钮问题,以符合项目需求了?经过一番搜索发现利用GridLocalizer可以很好实现: 核心代码: public class BuilderGridLocalizer : GridLocalizer { Dictionary<GridStringId, string> CusLocalizedKeyValue = null; /// <su

ASP.NET MVC 4 - 上传图片到数据库

这里演示如何在MVC WEB应用程序如何上传图片到数据库以及如何在WEB页面上显示图片.数据库表对应整个Model类,不单图片数据一个字段,我们从数据表的定义开始: CREATE TABLE [dbo].[Products] ( [ProductID] INT IDENTITY (1, 1) NOT NULL, [Name] NVARCHAR (MAX) NOT NULL, [Description] NVARCHAR (MAX) NOT NULL, [Price] DECIMAL (18, 2

[WinForm][DevExpress][GridControl]CustomColumnDisplayText Helper

在实际开发中,有时候需要对GridControl中列值进行转义,譬如1转义成完成等等,一般在诸如CustomColumnDisplayText事件中能够轻松完成,为了提高代码复用性,所以对CustomColumnDisplayText进行包装 关键代码: /// <summary> /// CustomColumnDisplayText Helper /// </summary> /// <param name="girdview">GridView

[WinForm][DevExpress][TreeList]向上递归,获取公共父节点

最近项目开发中,需要获取到公共节点,如图: 譬如,当点击"Test103-2"节点,其类型是"灯"类型,那怎么获取到"中心区域"这个类型是"地域"的公共节点了?(不知道描述清楚木有哈) 核心代码: /// <summary> /// 向上递归,获取符合条件的父节点 /// </summary> /// <param name="node">需要向上递归的节点</pa

[WinForm][DevExpress]设置TreeListNode的背景色

关键代码: /// <summary> /// 设置节点背景色 /// 在NodeCellStyle事件中使用 /// </summary> /// <param name="tree">TreeList</param> /// <param name="e">GetCustomNodeCellStyleEventArgs</param> /// <param name="bui

[WinForm][DevExpress][TreeList]节点互斥

关键代码: /// <summary> /// 节点互斥同步 /// 说明 /// eg: ///TreeListNode _node = e.Node; ///_node.SyncMutexNodeCheckState(_node.CheckState, n => n.GetNodeType() == NodeType.Cab); /// </summary> /// <param name="node">需要互斥同步的节点</para

[WinForm][DevExpress][TreeList]父子节点CheckState状态同步

关键代码: /// <summary> ///同步父子节点勾选状态 ///说明 ///在AfterCheckNode事件中使用代码 ///eg:e.Node.SyncNodeCheckState(e.Node.CheckState); /// </summary> /// <param name="node">需要同步的节点</param> /// <param name="check">节点当前勾选状态&

winform如何实现将数据库数据加载到树上

一.简介 对于winform中如何加载xml生成目录树,在前边一篇文章"c#如何实现从xml中加载树目录,并且显示完整的Text"中我已经写了详细的过程.但是有些时候我们不可能将大量的数据存储到xml中,原因是,xml一般用于小数据量的传递.而大数据的存储与传递我们一般用专门的数据库管理工具作为传递的介质.在此,声明一点是,对于大数据量的传递,我们在这里不考虑速率传递快慢问题,我们举例只是实现最基本的功能,这样也方便和我一样的初学者理解. 好了,说了这么多废话,开始正式进入我们这篇文章

[WinForm][DevExpress][TreeList]条件隐藏节点CheckBox

关键代码: /// <summary> /// 隐藏CheckBox /// 说明 /// 在CustomDrawNodeCheckBox事件中使用 /// eg: /// TreeList _curTree = (TreeList)sender; /// _curTree.HideCheckBox(n => n.GetNodeType() == NodeType.Area || n.GetNodeType() == NodeType.CabsGroupRoot, e); /// <