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

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

本人在开发形成自己的Winform开发框架及WCF开发框架过程中,对这些进行了优化整理,现公布出来和大家一起讨论学习,希望给大家提供一个参考外,自己有进一步的提升。本文主要以WCF开发框架下的个人图片信息上传保存作为主题,介绍其中涉及到的一些知识点和操作,以及规避其中一些常见的问题。

1)首先,我们需要在数据库里面设置几个Image对象字段(我这里采用的是SqlServer数据库)。

2)我们需要先做好数据库存储底层的操作函数,把图片信息存储在不同的字段里面,由于这个操作类似,因此设置一个枚举来选择不同的字段存储,如下所示。

        /// <summary>
        /// 根据图片枚举类型获取对应的字段名称
        /// </summary>
        /// <param name="imageType">图片枚举类型</param>
        /// <returns></returns>
        private string GetFieldNameByImageType(UserImageType imageType)
        {
            string fieldName = "Portrait";
            switch (imageType)
            {
                case UserImageType.个人肖像:
                    fieldName = "Portrait";
                    break;
                case UserImageType.身份证照片1:
                    fieldName = "IDPhoto1";
                    break;
                case UserImageType.身份证照片2:
                    fieldName = "IDPhoto2";
                    break;
                case UserImageType.名片1:
                    fieldName = "BusinessCard1";
                    break;
                case UserImageType.名片2:
                    fieldName = "BusinessCard2";
                    break;
            }
            return fieldName;
        }

        /// <summary>
        /// 更新个人相关图片数据
        /// </summary>
        /// <param name="imagetype">图片类型</param>
        /// <param name="userId">用户ID</param>
        /// <param name="imageBytes">图片字节数组</param>
        /// <returns></returns>
        public bool UpdatePersonImageBytes(UserImageType imagetype, string userId, byte[] imageBytes)
        {
            string fieldName = GetFieldNameByImageType(imagetype);

            string sql = string.Format("update Users set {0}=@image where Id = '{1}' ", fieldName, userId);
            Database db = DatabaseFactory.CreateDatabase();
            DbCommand dbCommand = db.GetSqlStringCommand(sql);
            db.AddInParameter(dbCommand, "image", DbType.Binary, imageBytes);
            return db.ExecuteNonQuery(dbCommand) > 0;

3)以上是保存图片的操作,还需要做一个通用类型的图片下载操作,把用户图片信息保存在byte数组中,方便在客户端把字节转换为具体的文件字节。

         /// <summary>

        /// 根据个人图片枚举类型获取图片数据
        /// </summary>
        /// <param name="imagetype">图片枚举类型</param>
        /// <returns></returns>
        public byte[] GetPersonImageBytes(UserImageType imagetype, string userId)
        {
            string fieldName = GetFieldNameByImageType(imagetype);

            string sql = string.Format("Select {0} from Users where Id = '{1}' ", fieldName, userId);
            Database db = DatabaseFactory.CreateDatabase();
            DbCommand dbCommand = db.GetSqlStringCommand(sql);

            byte[] imageBytes = null;
            using (IDataReader reader = db.ExecuteReader(dbCommand))
            {
                if (reader.Read())
                {
                    imageBytes = (reader.IsDBNull(reader.GetOrdinal(fieldName))) ? null : (byte[])reader[0];
                }
            }

            return imageBytes;
        }

4)然后设计一个图片上传显示的窗体,其中窗体的图片控件默认显示一个替代的图片,一个美观,二个也方便用户快速设置图片,如下所示。

 

其最终效果如下所示,除了可以展示图片外,双击可以预览图片的内容,便于用户放大缩小对图片细看。

 

5)其中实现图片上传的WCF客户端代码如下所示。

        private void btnSavePortrait_Click(object sender, EventArgs e)
        {
            if (picPortrait.Image != null)
            {
                new UserServiceClient().Using(client =>
                {
                    try
                    {
                        byte[] imageBytes = ImageHelper.ImageToBytes(this.picPortrait.Image);
                        bool sucess = client.UpdatePersonImageBytes(UserImageType.个人肖像,
                            Portal.gc.LoginInfo.Id, imageBytes);
                        MessageDxUtil.ShowTips(sucess ? "个人肖像 图片保存成功!" : "保存失败!");
                    }
                    catch (Exception ex)
                    {
                        MessageDxUtil.ShowError(ex.Message);
                        LogTextHelper.Error(ex);
                    }
                });
            }
       } 

 重置图片的代码如下所示。

private void ResetDefaultImage(UserImageType imageType)
        {
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmPersonalInfo));
            switch (imageType)
            {
                case UserImageType.个人肖像:
                    this.picPortrait.EditValue = ((object)(resources.GetObject("picPortrait.EditValue")));
                    break;
                case UserImageType.身份证照片1:
                    this.picIDCard1.EditValue = ((object)(resources.GetObject("picIDCard1.EditValue")));
                    break;
                case UserImageType.身份证照片2:
                    this.picIDCard2.EditValue = ((object)(resources.GetObject("picIDCard2.EditValue")));
                    break;
                case UserImageType.名片1:
                    this.picCard1.EditValue = ((object)(resources.GetObject("picCard1.EditValue")));
                    break;
                case UserImageType.名片2:
                    this.picCard2.EditValue = ((object)(resources.GetObject("picCard2.EditValue")));
                    break;
            }
        } 

由于采用了枚举类型UserImageType来区分不同的图片信息,因此多种图片的上传、显示、重置操作,基本上都相同的,较好地实现了代码的重用。另外值得注意的是,WCF默认不支持大一点的图片上传,一般需要设置配置文件来实现图片数据的上传(一般图片还是有点大的),所以需要设置服务端和客户端的配置文件,如下所示。

服务端的Web.Config配置文件如下所示 

 

客户端配置如下所示。 

 

 本文转自博客园伍华聪的博客,原文链接:WCF开发框架形成之旅--个人图片信息的上传保存,如需转载请自行联系原博主。

时间: 2024-09-21 19:35:37

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

WCF开发框架形成之旅---结合代码生成工具实现快速开发

我的WCF开发框架推出很久了,一直有不少的朋友支持及提供良好的完善意见,随着利用这种基于Winform界面的WCF开发框架开发了不同类型的项目,各种WCF对象的调用及处理逐渐稳定及统一化,因此是时候让我的开发伴侣(代码生成工具Database2Sharp)来做更多更有技术性的工作了---提供基于我的WCF开发框架模式创建的项目工程及调用WCF的Winform界面处理代码.这样在WCF快速开发框架中,有了更强更高效率的支持,整个项目的开发,就更加是水到渠成,闲庭散步了. 因此,代码生成工具生成框架

WCF开发框架形成之旅---终极WCF框架是什么样子的

前面几篇WCF框架的文章,一直是介绍我的WCF框架的形成中的知识,期间虽然我在工作项目中已经成功运用各种WCF的概念及特性,而且是多个部门之间的数据管理系统,基本上WCF框架的雏形已经形成了,不过我一直想把我成熟的Winform开发框架,提炼整合到WCF框架上,这样在成熟的Winform框架基础上应用的WCF技术,才是我整个WCF开发框架的终极形式,虽然项目时间很紧,但业余空闲时间我一直未曾停步,前阵子通宵达旦完成,并经过多番测试,今天有幸和大家分享一下这个WCF框架的真面目及其中的一些经验总结

WCF开发框架形成之旅--您的数据是否需要加密

基于WCF技术,搭建基于分布式的网络应用,目前已经是很常见的应用,在上篇随笔<基于我的Winform开发框架扩展而成的WCF开发框架>中,介绍了我自己的Winform开发框架的一些基础知识及扩展而成的WCF开发框架,上篇随笔只是基于快速应用搭建而成的WCF框架,并没有考虑到数据安全性的问题,在互联网的环境中,数据的安全性是必须考虑的一道门槛,否则明文数据满天飞,犹如人在大街上裸奔一样令人不安,除非是你认为你的应用数据无关紧要.本文主要通过技术对比,介绍如何创建一个Winform客户端测试WCF

WCF开发框架形成之旅--WCF应用常见问题处理

本文继续前面几篇关于WCF开发框架的随笔,继续介绍WCF的一些经验和知识,其中主要介绍在使用WCF开发中碰到的问题以及解决方法,为自己做个记号,也为后来者提供解决思路,其中包括有动态修改 WCF配置内容.规范WCF客户端的调用和处理.  1. 动态修改WCF配置内容 由于在软件登录界面中,需要提供用户切换内网.外网的功能,而配置文件中内外网的地址配置是不一样的,因此需要动态修改应用程序的配置文件,然后更新其中节点内容,界面如下所示.   修改WCF节点的C#代码如下所示         priv

Winform开发之离线式WCF开发框架的实现介绍

在上篇随笔<Winform开发框架之框架演化>中介绍了几种Winform开发框架,其中有对于离线式WCF开发框架的介绍,离线式的WCF开发框架 ,就是结合了传统Winform开发框架的数据访问方式,又利用了WCF分布式数据获取的特点,使得数据可以离线使用,在一种业务要求集中化,又要求不影响正常业务操作的应用系统场景下比较适合.本文主要介绍如何利用我的Winform开发框架的整体思路,实现WCF开发框架的离线式的数据上传.更新的同步操作. 其实目前企业集中化管理,这种模式要求很多,如一些加盟店的

基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用

在前面介绍了两篇关于我的基于MVC4+EasyUI技术的Web开发框架的随笔,本篇继续介绍其中界面部分的一些使用知识,包括控件的赋值.取值.清空,以及相关的使用. 我们知道,一般Web界面包括的界面控件有:单行文本框.多行文本框.密码文本框.下拉列表Combobox.日期输入控件.数值输入控件.单项选择.复选框.表格控件DataGrid.树形控件.布局控件.弹出式对话框.提示信息.列表控件等,这些界面控件的操作都有哪些不同,下面我们来逐一进行介绍. 1.单行文本框 使用easyui的控件,单行文

基于MVC4+EasyUI的Web开发框架形成之旅--附件上传组件uploadify的使用

大概一年前,我还在用Asp.NET开发一些行业管理系统的时候,就曾经使用这个组件作为文件的上传操作,在随笔<Web开发中的文件上传组件uploadify的使用>中可以看到,Asp.NET中如何使用这个组件进行文件上传的,当时上传文件的处理主要也是使用ashx一般处理程序来进行处理的.本文主要介绍我的Web开发框架中,在MVC4的环境中如何集成这个非常棒的文件上传组件的. 1.上传组件uploadify的说明及脚本引用 Uploadify 是 JQuery 一个著名的上传插件,利用 Flash

基于MVC4+EasyUI的Web开发框架形成之旅--总体介绍

最近花了很多时间在重构和进一步提炼Winform开发框架的工作上,加上时不时有一些项目的开发工作,我博客里面介绍Web开发框架的文章比较少,其实以前在单位工作,80%的时间是做Web开发的,很早就形成了自己的一套Web开发框架,但是由于一些个人原因,一直没有来得及好好整理和推广,其实那套Web开发框架对大多数企业信息化还是很有帮助的,包括了整体性的框架布局.样式,以及权限控制.菜单管理.字典管理.工作流审批管理等常见模块,不过总体觉得技术上是采用asp.net的Webform技术,因此现在MVC

基于MVC4+EasyUI的Web开发框架形成之旅--MVC控制器的设计

自从上篇<基于MVC4+EasyUI的Web开发框架形成之旅--总体介绍>总体性的概括,得到很多同行的关注和支持,不过上一篇主要是介绍一个总体的界面效果和思路,本系列的文章将逐步介绍其中的细节,本文主要介绍整个Web开发框架中的MVC控制器的设计.在设计之初,我就希望尽可能的减少代码,提高编程模型的统一性.因此希望能够以基类继承的方式,和我Winform开发框架一样,尽可能通过基类,而不是子类的重复代码来实现各种通用的操作. 1.登录控制的控制器基类设计 我们知道,一般我们创建一个MVC的控制