博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# winform DevExpress上传图片到数据库【转】
阅读量:6285 次
发布时间:2019-06-22

本文共 5462 字,大约阅读时间需要 18 分钟。

实现功能如下图:

实现功能
注明:此文使用的是DevExpress控件,winform 原生控件也是一样使用方法。

1.点击选择图片按钮,功能为通过对话框选择要上传的文件,并将该文件在下面的PictureEdit中显示出来。具体代码如下:

private void btnChoosePic_Click(object sender, EventArgs e)        {            ShowPic(pictureEdit1);        }        ///  /// 选择图片 ///  ///  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.上传图片,该按钮的功能是将选定的图片上传到数据库中,具体的实现代码如下:

///         /// 上传图片 ///  ///  ///  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方法代码如下:

///         /// 保存图片到数据库 ///  ///  ///  ///  ///  ///  /// 
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;

///         /// 窗口加载 ///  ///  ///  private void HeadManager_Load(object sender, EventArgs e) { LoadImage(PicType, PicType.Equals("教师") ? TeacherId : StudentId); } ///  /// 获取图片 ///  ///  ///  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.用到的公共方法:

///         /// 转换为Byte[] ///  ///  /// 
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; } /// /// 读取byte[]并转化为图片 /// /// byte[] ///
Image
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; }
你可能感兴趣的文章
validate表单验证及自定义方法
查看>>
javascript 中出现missing ) after argument list的错误
查看>>
使用Swagger2构建强大的RESTful API文档(2)(二十三)
查看>>
Docker容器启动报WARNING: IPv4 forwarding is disabled. Networking will not work
查看>>
(转)第三方支付参与者
查看>>
程序员修炼之道读后感2
查看>>
DWR实现服务器向客户端推送消息
查看>>
js中forEach的用法
查看>>
Docker之功能汇总
查看>>
!!a标签和button按钮只允许点击一次,防止重复提交
查看>>
(轉貼) Eclipse + CDT + MinGW 安裝方法 (C/C++) (gcc) (g++) (OS) (Windows)
查看>>
还原数据库
查看>>
作业调度框架 Quartz.NET 2.0 beta 发布
查看>>
mysql性能的检查和调优方法
查看>>
项目管理中的导向性
查看>>
Android WebView 学习
查看>>
(转)从给定的文本中,查找其中最长的重复子字符串的问题
查看>>
HDU 2159
查看>>
spring batch中用到的表
查看>>
资源文件夹res/raw和assets的使用
查看>>