zoukankan      html  css  js  c++  java
  • 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”)

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

     
     

  • 相关阅读:
    67. Add Binary
    66. Plus One
    64. Minimum Path Sum
    63. Unique Paths II
    How to skip all the wizard pages and go directly to the installation process?
    Inno Setup打包之先卸载再安装
    How to change the header background color of a QTableView
    Openstack object list 一次最多有一万个 object
    Openstack 的 Log 在 /var/log/syslog 里 【Ubuntu】
    Git 分支
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2476609.html
Copyright © 2011-2022 走看看