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

點擊發送端“瀏覽按鈕” 進行選擇圖片,之后點擊“上傳按鈕”。這時,你會發現客戶端上傳的圖片顯示在了接收端的窗體上。程序運行成功。

 
 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM