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配置文件以下所示
客戶端配置以下所示。