WCF開發框架造成之旅--我的圖片信息的上傳保存

WCF開發框架造成之旅--我的圖片信息的上傳保存html

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

 

客戶端配置以下所示。 

 

相關文章
相關標籤/搜索