• WCF开发框架形成之旅--个人图片信息的上传保存


    WCF开发框架形成之旅--个人图片信息的上传保存

    http://www.cnblogs.com/wuhuacong/archive/2011/12/23/2299614.html

    一般在业务系统里面,除了存储个人的基本信息外,可能也都需要存储个人的一些图片信息,通常如肖像、名片、身份证等重要图片信息,而这些信息偏小为了方便管理,一般也是和个人基本信息一起放在数据库里面的。

    本人在开发形成自己的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数组中,方便在客户端把字节转换为具体的文件字节。

         

     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客户端代码如下所示。

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

     

    客户端配置如下所示。 

     

  • 相关阅读:
    PHP xml_get_current_column_number() 函数
    PHP xml_get_current_byte_index() 函数
    PHP xml_error_string() 函数
    PHP utf8_encode() 函数
    PHP utf8_decode() 函数
    MySQL 资料库概论与MySQL 安装
    SEO之网站关键词的优化 :首页,内页关键字,长尾关键字
    前端开发chrome console的使用 :评估表达式 – Break易站
    chrome console的使用 : 异常和错误的处理 – Break易站
    SEO的基本概念 和 提交SITEMAP到搜索引擎
  • 原文地址:https://www.cnblogs.com/qq260250932/p/5338343.html
Copyright © 2020-2023  润新知