好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

WCF实现上传图片功能

WCF实现上传图片功能

功能介绍:

主要是使用WCF框架实现从客户端上传图片到服务端并在服务端显示的基本功能。

一、首先创建两Windows窗体应用程序“WinFormClient”(客户端、发送端)和“WinFormReceiver”(接收端)

1、如图设计FormClient(发送端窗体)的界面,上边是一个panel容器中添加了一个TextBox和 两个Button,下边是一个PictureBox控件(用于浏览上传之前的图片)。

然后添加浏览按钮下的后台代码,实现客户端浏览的功能。

 string  fileName =  "" ; //  定义一个全局变量;
          //  浏览选择上传内容 
         private   void  btnBrowser_Click( object   sender, EventArgs e)
        {

              //  string fileName = "";  //  定义一个字段用于获取上传的文件名; 
            OpenFileDialog openFileDialog =  new  OpenFileDialog(); //  创建一个OpenFileDialog对象专门用于打开文件 
             if  (openFileDialog.ShowDialog() == DialogResult.OK) //  打开的文件对话框如果选择了OK按钮(确定),则为真,执行大括号中的内容 
             {
                fileName  =  openFileDialog.FileName;
                txtPicName.Text  = fileName; //  在textBox中显示文件名 
                pictureBox1.Load(fileName); //  使该图片在客户端pictuBox中显示 
             }
              else 
                 return ; //  未选中文件则返回; 
        }

将WinFomClient设为启动项目,运行

当你选择图片后,该图片会显示在发送端的窗体中,供发送者浏览,如需更改上传图片可重新选取,该图片将会被覆盖掉。(上传功能将在下文实现)

2、FormReceiver接收端的窗体只需添加一个PictureBox控件,用于显示客户端上传的图片。

二、在解决方案中添加两个类库:ITransferPic(接口)、TransferPic(继承接口),一个控制台应用程序 TransferPicHost(宿主程序);

该实例采用的是“自身托管宿主”并非“IIS宿主”。

1、ITransferPic

(1)、添加引用:using System.ServiceModel;   using System.IO;

(2)、创建一个“ITransferPicService”接口

 [ServiceContract]
      public   interface   ITransferPicService
    {
        [OperationContract]  //  操作契约 
         Stream GetPic();
        [OperationContract]
          void   SendPic(Stream transferPic);
    } 

2、TransferPic 

(1)、添加引用:using ITransferPic;  using System.IO;

(2)、创建一个“TransferPicService” 类,继承接口“ITransferPicService”并实现该接口;

 public   class   TransferPicService : ITransferPicService
    {
          public   static  Stream PicSource =  new   MemoryStream();
        
          ///   <summary> 
         ///   从服务端下载图片到本地 (上传和下载都是拷贝的过程)
          ///   </summary> 
         ///   <returns></returns> 
         public   Stream GetPic()
        {
            MemoryStream ms  =  new   MemoryStream();
            PicSource.Position  =  0 ; //  指明从第0位开始拷贝 
            PicSource.CopyTo(ms); //  服务端将客户端的Stream复制一份 
            ms.Position =  0 ; //  注意如果缺少该条代码接收端将无法显示上传图片 
             return  ms; //  然后在返回客户端; 
         }

          ///   <summary> 
         ///   从客户端上传图片到服务端(将客户端的Stream拷贝给服务端的Stream)
          ///   </summary> 
         ///   <param name="transferPic"></param> 
         public   void   SendPic(Stream transferPic)
        {
            PicSource.Position  =  0  ;
            transferPic.CopyTo(PicSource);
        }
    } 

3、TransferPicHose

自身托管宿主: 利用WCF提供的ServiceHost<T>提供的Open()和Close()方法,可以便于开发者在控制台应用程序,Windows应用程序乃至于ASP.NET应用程序中托管服务。不管自宿主的环境是何种应用程序,实质上托管服务的方式都是一致的。如该实例中用到的代码部分:

添加引用:

using System.ServiceModel;
using ITransferPic;
using System.ServiceModel.Description;

 class   Program
    {
          static   void  Main( string  [] args)
        {
            NetTcpBinding bind  =  new   NetTcpBinding();
            bind.MaxBufferSize  =  214783647  ;
            bind.TransferMode  =  TransferMode.Streamed;
            bind.MaxReceivedMessageSize  =  214783647  ;
            bind.Security.Mode  =  SecurityMode.None;

              //  超出using 范围程序会自动释放  
             using  (ServiceHost host =  new  ServiceHost( typeof  (TransferPic.TransferPicService)))
            {
                host.AddServiceEndpoint(  typeof (ITransferPicService), bind,  "  net.tcp://localhost:9600/transferPic  " ); //  该地址为宿主地址,和客户端接收端地址保持一致 
                 if  (host.Description.Behaviors.Find<ServiceMetadataBehavior>() ==  null  )
                {
                    ServiceMetadataBehavior behavior  =  new   ServiceMetadataBehavior();
                    behavior.HttpGetEnabled  =  true  ;
                    behavior.HttpGetUrl  =  new  Uri( "  http://localhost:9603/transferPic/metadata/  "  );
                    host.Description.Behaviors.Add(behavior);

                }

                host.Opened  +=  delegate  { Console.WriteLine( "  图片程序已成功启动!  "  ); };
                host.Open();
                Console.ReadLine();
            }
        }
       
    } 

三、实现上传。

1、WinFormClient 后台上传按钮部分;

添加引用:

using System.IO;
using System.ServiceModel;
using ITransferPic;

 //  执行上传功能 
         private   void  btnUpload_Click( object   sender, EventArgs e)
        {
              //  pictureBox1.Load(fileName);

              //  读取流,上传文件流到服务器 
            FileStream fs =  new  FileStream(fileName, FileMode.Open, FileAccess.Read); //  创建一个文件,并把文件放在文件流里边; 
            Stream sm =  new  MemoryStream(); //  创建一个滤层流 将文件从第0位拷贝到sm中 
            fs.Position =  0 ; //  获取或设置此流的当前位置 
             fs.CopyTo(sm);
              //  拷贝完成之后进行上传 
 
            EndpointAddress epAddr  =  new  EndpointAddress( "  net.tcp://localhost:9600/transferPic  " ); //  此处也可以用IIS做服务 
            NetTcpBinding bind =  new  NetTcpBinding(); //  绑定方式 
            bind.MaxBufferPoolSize =  2147483647 ; //  最大缓冲 
            bind.TransferMode = TransferMode.Streamed; //  传输模式为流式处理 
            bind.MaxReceivedMessageSize =  2147483647 ; //  定义了服务端接收Message的最大长度,防止文件过大 
            bind.Security.Mode = SecurityMode.None; //  安全模式设置为不进行验证;
              //  创建一个工厂 
            ITransferPicService proxy = ChannelFactory<ITransferPicService> .CreateChannel(bind, epAddr);
            sm.Position  =  0  ;
            proxy.SendPic(sm);  //  WCF客户端调用该方法 把客户端sm上传到服务端去; 
        }

2、WinFormReceiver 后台。

添加引用:

using ITransferPic;
using System.IO;
using System.ServiceModel;

  private   void  FormReceiver_Load( object   sender, EventArgs e)
        {
            Thread myThread  =  new  Thread(ShowPic); //  创建一个线程 
            myThread.IsBackground =  true ; //  设置后台线程(防止主程序关闭后,仍在运行) 
            myThread.Start(); //  启动线程 
         }

          public   void   ShowPic()
        {
              #region  同客户端一样,创建WCF客户端 

            EndpointAddress epAddr  =  new  EndpointAddress( "  net.tcp://localhost:9600/transferPic  "  );
            NetTcpBinding bind  =  new   NetTcpBinding();
            bind.MaxBufferPoolSize  =  2147483647  ;
            bind.TransferMode  =  TransferMode.Streamed;
            bind.MaxReceivedMessageSize  =  2147483647  ;
            bind.Security.Mode  =  SecurityMode.None;
              //  创建一个通道 
            ITransferPicService proxy = ChannelFactory<ITransferPicService> .CreateChannel(bind, epAddr);
            
              #endregion 

             while  ( true  )
            {
                Stream streamFromServer  = proxy.GetPic();  //  返回一个文件流; 
                MemoryStream ms =  new  MemoryStream(); //  滤层流拷贝一份; 
                ms.Position =  0  ;
                streamFromServer.CopyTo(ms);  //  将该文件流拷贝给到ms; 
                 if  (ms.Length ==  0  )
                {
                    System.Threading.Thread.Sleep(  300 ); //  300百毫秒执行一次; 
                     continue  ;
                }
                Bitmap tn  =  new  Bitmap(ms); //  创建一个位图;把ms变成图片; 
                pictureBox1.Image =  tn;

                System.Threading.Thread.Sleep(  300 ); //  300百毫秒执行一次;Sleep表示当前线程挂起指定的时间; 
             }
        } 

 四、运行程序。

1、打开TransferPicHost 文件中bin目录,启动“TransferPicHost.exe”,此时会弹出一个控制台应用程序的窗体,并提示“图片功能已成功启动!”。

2、分别启动发送端和接收端项目程序;

(将“WinFormClient” 或者 “WinFormReceiver” 设为启动项目,并启动另一个项目文件夹bin目录下的“WinFormReceiver.exe”或者“WinFormClient.exe”)

点击发送端“浏览按钮” 进行选择图片,之后点击“上传按钮”。这时,你会发现客户端上传的图片显示在了接收端的窗体上。程序运行成功。

 
 

分类:  .Net开发之WCF实例应用

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于WCF实现上传图片功能的详细内容...

  阅读:38次