zoukankan      html  css  js  c++  java
  • WCF实现上传图片功能

    功能介绍:

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

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

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

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

    View Code
     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”接口

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

    2、TransferPic 

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

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

    View Code
    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;

    View Code
    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;

    View Code
    //执行上传功能
            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;

    View Code
     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”)

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

     
     

  • 相关阅读:
    非常不错的学习网站——技术胖
    Vue中使用mescroll.js实现下拉刷新
    2020.10.07【NOIP提高A组】模拟
    2020.10.06【NOIP提高A组】模拟 总结
    2020.09.19【NOIP提高A组】模拟
    2020.09.12【NOIP提高A组】模拟
    GMOJ 4417. 【HNOI2016模拟4.1】神奇的字符串 题解
    上下界网络流学习笔记
    GMOJ 3571. 【GDKOI2014】内存分配 题解
    [模板]人工栈
  • 原文地址:https://www.cnblogs.com/Shang0109/p/2476137.html
Copyright © 2011-2022 走看看