WCF开发框架形成之旅--个人图片信息的上传保存
http://www.cnblogs.com/wuhuacong/archive/2011/12/23/2299614.html
一般在业务系统里面,除了存储个人的基本信息外,可能也都需要存储个人的一些图片信息,通常如肖像、名片、身份证等重要图片信息,而这些信息偏小为了方便管理,一般也是和个人基本信息一起放在数据库里面的。
本人在开发形成自己的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) > ;
}
3)以上是保存图片的操作,还需要做一个通用类型的图片下载操作,把用户图片信息保存在byte数组中,方便在客户端把字节转换为具体的文件字节。
/// 根据个人图片枚举类型获取图片数据
/// </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[];
}
} 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开发框架形成之旅--个人图片信息的上传保存的更多相关文章
- WCF开发框架形成之旅---WCF的几种寄宿方式
WCF开发框架形成之旅---WCF的几种寄宿方式 WCF寄宿方式是一种非常灵活的操作,可以在IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者 ...
- (转)WCF开发框架形成之旅---WCF的几种寄宿方式
WCF寄宿方式是一种非常灵活的操作,可以在IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者方便.高效提供服务调用.本文分别对这几种方式进行详 ...
- 转--基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用
原文 http://www.cnblogs.com/wuhuacong/p/3317223.html 基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用 在前面介绍了两篇关于我的基 ...
- 基于MVC4+EasyUI的Web开发框架形成之旅--附件上传组件uploadify的使用
大概一年前,我还在用Asp.NET开发一些行业管理系统的时候,就曾经使用这个组件作为文件的上传操作,在随笔<Web开发中的文件上传组件uploadify的使用>中可以看到,Asp.NET中 ...
- 基于MVC4+EasyUI的Web开发框架形成之旅--总体介绍
最近花了很多时间在重构和进一步提炼Winform开发框架的工作上,加上时不时有一些项目的开发工作,我博客里面介绍Web开发框架的文章比较少,其实以前在单位工作,80%的时间是做Web开发的,很早就形成 ...
- 基于MVC4+EasyUI的Web开发框架形成之旅--MVC控制器的设计
自从上篇<基于MVC4+EasyUI的Web开发框架形成之旅--总体介绍>总体性的概括,得到很多同行的关注和支持,不过上一篇主要是介绍一个总体的界面效果和思路,本系列的文章将逐步介绍其中的 ...
- 基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用
在前面介绍了两篇关于我的基于MVC4+EasyUI技术的Web开发框架的随笔,本篇继续介绍其中界面部分的一些使用知识,包括控件的赋值.取值.清空,以及相关的使用. 我们知道,一般Web界面包括的界面控 ...
- 基于MVC4+EasyUI的Web开发框架形成之旅--框架总体界面介绍
在前面介绍了一些关于最新基于MVC4+EasyUI的Web开发框架文章,虽然Web开发框架的相关技术文章会随着技术的探讨一直写下去,不过这个系列的文章,到这里做一个总结,展示一下整体基于MVC4+Ea ...
- 基于MVC4+EasyUI的Web开发框架形成之旅--基类控制器CRUD的操作
在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的控制器的设计关系,Web开发框架沿用了我的<Winform开发框架>的很多架构设计思 ...
随机推荐
- sftp服务器的安装与远程
本文所描述环境只在window系统下 一.搭建sftp服务器 1.首先需要下载一个软件freeSSHd,下载地址http://www.freesshd.com/?ctt=download,下载第一个f ...
- CentOS Yum 源搭建
创建yum源服务,主要用到了两个软件createrepo和httpd.前者是创建yum源索引的工具,后者是提供文件在线流浪的功能,当然,除了httpd之外,你也可以使用nginx替代. creater ...
- vim使用跳转列表 jumps 来跟踪 (历史位置的)导航
参考: Vim使用跳转列表来跟踪你的导航,你可以通过这个列表来向前或者向后导航. 跳转列表保留所有地方的轨迹,它可以跟踪文件名.行号和列号. 查看调整列表::jumps 导航键 描述 CTRL-o 跳 ...
- dede的应用
gbk和utf-8版本选择 gbk是国家编码,所有的内容编码,包括中文,英文,英文字符都占两个字节. utf-8是国际编码,中文三个字节,英文1个字节 现阶段,网站都用gbk编码, 一方面节省本地/网 ...
- ZOJ 3829 Known Notation(贪心)题解
题意:给一串字符,问你最少几步能变成后缀表达式.后缀表达式定义为,1 * 1 = 1 1 *,题目所给出的字串不带空格.你可以进行两种操作:加数字,交换任意两个字符. 思路:(不)显然,最终结果数字比 ...
- 【做题】arc080_f-Prime Flip——转换、数论及匹配
题意:有一个无限序列,其中有\(n\)个位置上的数为\(1\),其余都是\(0\).你可以进行若干次操作,每次选取序列上的一个区间\([l,r)\),满足\(r-l\)为奇质数,将在这个区间上的数都异 ...
- Nacos整合Spring Cloud Gateway实践
Spring Cloud Gateway官网:http://spring.io/projects/spring-cloud-gateway Eureka1.0的问题和Nacos对比:https://w ...
- (转)mblog解读(二)
(二期)12.开源博客项目mblog解读(二) [课程12]freema...模板.xmind77.9KB [课程12]hibernat...arch.xmind0.1MB freemarker模板技 ...
- 深度学习课程笔记(十五)Recurrent Neural Network
深度学习课程笔记(十五)Recurrent Neural Network 2018-08-07 18:55:12 This video tutorial can be found from: Yout ...
- Paper Reading: Perceptual Generative Adversarial Networks for Small Object Detection
Perceptual Generative Adversarial Networks for Small Object Detection 2017-07-11 19:47:46 CVPR 20 ...