http://www.cnblogs.com/wuhuacong/archive/2011/12/23/2299614.htmlsql
通常在业务系统里面,除了存储我的的基本信息外,可能也都须要存储我的的一些图片信息,一般如肖像、名片、身份证等重要图片信息,而这些信息偏小为了方便管理,通常也是和我的基本信息一块儿放在数据库里面的。数据库
本人在开发造成本身的Winform开发框架及WCF开发框架过程当中,对这些进行了优化整理,现公布出来和你们一块儿讨论学习,但愿给你们提供一个参考外,本身有进一步的提高。本文主要以WCF开发框架下的我的图片信息上传保存做为主题,介绍其中涉及到的一些知识点和操做,以及规避其中一些常见的问题。数组
1)首先,咱们须要在数据库里面设置几个Image对象字段(我这里采用的是SqlServer数据库)。框架
2)咱们须要先作好数据库存储底层的操做函数,把图片信息存储在不一样的字段里面,因为这个操做相似,所以设置一个枚举来选择不一样的字段存储,以下所示。函数
1 /// <summary> 2 /// 根据图片枚举类型获取对应的字段名称 3 /// </summary> 4 /// <param name="imageType">图片枚举类型</param> 5 /// <returns></returns> 6 private string GetFieldNameByImageType(UserImageType imageType) 7 { 8 string fieldName = "Portrait"; 9 switch (imageType) 10 { 11 case UserImageType.我的肖像: 12 fieldName = "Portrait"; 13 break; 14 case UserImageType.身份证照片1: 15 fieldName = "IDPhoto1"; 16 break; 17 case UserImageType.身份证照片2: 18 fieldName = "IDPhoto2"; 19 break; 20 case UserImageType.名片1: 21 fieldName = "BusinessCard1"; 22 break; 23 case UserImageType.名片2: 24 fieldName = "BusinessCard2"; 25 break; 26 } 27 return fieldName; 28 } 29 30 31 /// <summary> 32 /// 更新我的相关图片数据 33 /// </summary> 34 /// <param name="imagetype">图片类型</param> 35 /// <param name="userId">用户ID</param> 36 /// <param name="imageBytes">图片字节数组</param> 37 /// <returns></returns> 38 public bool UpdatePersonImageBytes(UserImageType imagetype, string userId, byte[] imageBytes) 39 { 40 string fieldName = GetFieldNameByImageType(imagetype); 41 42 string sql = string.Format("update Users set {0}=@image where Id = '{1}' ", fieldName, userId); 43 Database db = DatabaseFactory.CreateDatabase(); 44 DbCommand dbCommand = db.GetSqlStringCommand(sql); 45 db.AddInParameter(dbCommand, "image", DbType.Binary, imageBytes); 46 return db.ExecuteNonQuery(dbCommand) > 0;
}
3)以上是保存图片的操做,还须要作一个通用类型的图片下载操做,把用户图片信息保存在byte数组中,方便在客户端把字节转换为具体的文件字节。post
1 /// 根据我的图片枚举类型获取图片数据 2 /// </summary> 3 /// <param name="imagetype">图片枚举类型</param> 4 /// <returns></returns> 5 public byte[] GetPersonImageBytes(UserImageType imagetype, string userId) 6 { 7 string fieldName = GetFieldNameByImageType(imagetype); 8 9 string sql = string.Format("Select {0} from Users where Id = '{1}' ", fieldName, userId); 10 Database db = DatabaseFactory.CreateDatabase(); 11 DbCommand dbCommand = db.GetSqlStringCommand(sql); 12 13 byte[] imageBytes = null; 14 using (IDataReader reader = db.ExecuteReader(dbCommand)) 15 { 16 if (reader.Read()) 17 { 18 imageBytes = (reader.IsDBNull(reader.GetOrdinal(fieldName))) ? null : (byte[])reader[0]; 19 } 20 } 21 22 return imageBytes; 23 }
4)而后设计一个图片上传显示的窗体,其中窗体的图片控件默认显示一个替代的图片,一个美观,二个也方便用户快速设置图片,以下所示。学习
其最终效果以下所示,除了能够展现图片外,双击能够预览图片的内容,便于用户放大缩小对图片细看。优化
5)其中实现图片上传的WCF客户端代码以下所示。this
1 private void btnSavePortrait_Click(object sender, EventArgs e) 2 { 3 if (picPortrait.Image != null) 4 { 5 new UserServiceClient().Using(client => 6 { 7 try 8 { 9 byte[] imageBytes = ImageHelper.ImageToBytes(this.picPortrait.Image); 10 bool sucess = client.UpdatePersonImageBytes(UserImageType.我的肖像, 11 Portal.gc.LoginInfo.Id, imageBytes); 12 MessageDxUtil.ShowTips(sucess ? "我的肖像 图片保存成功!" : "保存失败!"); 13 } 14 catch (Exception ex) 15 { 16 MessageDxUtil.ShowError(ex.Message); 17 LogTextHelper.Error(ex); 18 } 19 }); 20 } 21 }
重置图片的代码以下所示。
1 private void ResetDefaultImage(UserImageType imageType) 2 { 3 System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmPersonalInfo)); 4 switch (imageType) 5 { 6 case UserImageType.我的肖像: 7 this.picPortrait.EditValue = ((object)(resources.GetObject("picPortrait.EditValue"))); 8 break; 9 case UserImageType.身份证照片1: 10 this.picIDCard1.EditValue = ((object)(resources.GetObject("picIDCard1.EditValue"))); 11 break; 12 case UserImageType.身份证照片2: 13 this.picIDCard2.EditValue = ((object)(resources.GetObject("picIDCard2.EditValue"))); 14 break; 15 case UserImageType.名片1: 16 this.picCard1.EditValue = ((object)(resources.GetObject("picCard1.EditValue"))); 17 break; 18 case UserImageType.名片2: 19 this.picCard2.EditValue = ((object)(resources.GetObject("picCard2.EditValue"))); 20 break; 21 } 22 }
因为采用了枚举类型UserImageType来区分不一样的图片信息,所以多种图片的上传、显示、重置操做,基本上都相同的,较好地实现了代码的重用。另外值得注意的是,WCF默认不支持大一点的图片上传,通常须要设置配置文件来实现图片数据的上传(通常图片仍是有点大的),因此须要设置服务端和客户端的配置文件,以下所示。
服务端的Web.Config配置文件以下所示
客户端配置以下所示。