熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

WCF實現上傳圖片功能

2013-11-13 10:02:13  來源: .NET編程 

  功能介紹
   
    主要是使用WCF框架實現從客戶端上傳圖片到服務端並在服務端顯示的基本功能
   
    一首先創建兩Windows窗體應用程序WinFormClient(客戶端發送端)和WinFormReceiver(接收端)
   
    如圖設計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 (openFileDialogShowDialog() == DialogResultOK)//打開的文件對話框如果選擇了OK按鈕(確定)則為真執行大括號中的內容
   
    {
   
    fileName = openFileDialogFileName;
   
    txtPicNameText = fileName;//在textBox中顯示文件名
   
    pictureBoxLoad(fileName)//使該圖片在客戶端pictuBox中顯示
   
    }
   
    else
   
    return;//未選中文件則返回
   
    }
   
    將WinFomClient設為啟動項目運行
   
    當你選擇圖片後該圖片會顯示在發送端的窗體中供發送者浏覽如需更改上傳圖片可重新選取該圖片將會被覆蓋掉(上傳功能將在下文實現)
   
    FormReceiver接收端的窗體只需添加一個PictureBox控件用於顯示客戶端上傳的圖片
   


    二在解決方案中添加兩個類庫ITransferPic(接口)TransferPic(繼承接口)一個控制台應用程序 TransferPicHost(宿主程序)
   
    該實例采用的是自身托管宿主並非IIS宿主
   
    ITransferPic
   
    (添加引用using SystemServiceModel;   using SystemIO;
   
    (創建一個ITransferPicService接口
   
    View Code
   
    [ServiceContract]
   
    public interface ITransferPicService
   
    {
   
    [OperationContract]//操作契約
   
    Stream GetPic()
   
    [OperationContract]
   
    void SendPic(Stream transferPic)
   
    }
   
    TransferPic
   
    (添加引用using ITransferPic;  using SystemIO;
   
    (創建一個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()
   
    PicSourcePosition = ;//指明從第位開始拷貝
   
    PicSourceCopyTo(ms)//服務端將客戶端的Stream復制一份
   
    msPosition = ;//注意如果缺少該條代碼接收端將無法顯示上傳圖片
   
    return ms;//然後在返回客戶端
   
    }
   
    /// <summary>
   
    /// 從客戶端上傳圖片到服務端(將客戶端的Stream拷貝給服務端的Stream)
   
    /// </summary>
   
    /// <param name=transferPic></param>
   
    public void SendPic(Stream transferPic)
   
    {
   
    PicSourcePosition = ;
   
    transferPicCopyTo(PicSource)
   
    }
   
    }
   
    TransferPicHose
   
    自身托管宿主 利用WCF提供的ServiceHost<T>提供的Open()和Close()方法可以便於開發者在控制台應用程序Windows應用程序乃至於ASPNET應用程序中托管服務不管自宿主的環境是何種應用程序實質上托管服務的方式都是一致的如該實例中用到的代碼部分
   
    添加引用
   
    using SystemServiceModel;
   
    using ITransferPic;
   
    using SystemServiceModelDescription;
   
    View Code
   
    class Program
   
    {
   
    static void Main(string[] args)
   
    {
   
    NetTcpBinding bind = new NetTcpBinding()
   
    bindMaxBufferSize = ;
   
    bindTransferMode = TransferModeStreamed;
   
    bindMaxReceivedMessageSize = ;
   
    bindSecurityMode = SecurityModeNone;
   
    //超出using 范圍程序會自動釋放
   
    using (ServiceHost host = new ServiceHost(typeof(TransferPicTransferPicService)))
   
    {
   
    hostAddServiceEndpoint(typeof(ITransferPicService) bind nettcp://localhost:/transferPic//該地址為宿主地址和客戶端接收端地址保持一致


   
    if (hostDescriptionBehaviorsFind<ServiceMetadataBehavior>() == null)
   
    {
   
    ServiceMetadataBehavior behavior = new ServiceMetadataBehavior()
   
    behaviorHttpGetEnabled = true;
   
    behaviorHttpGetUrl = new Uri(//localhost:/transferPic/metadata/
   
    hostDescriptionBehaviorsAdd(behavior)
   
    }
   
    hostOpened += delegate { ConsoleWriteLine(圖片程序已成功啟動! };
   
    hostOpen()
   
    ConsoleReadLine()
   
    }
   
    }
   
    }
   
    三實現上傳
   
    WinFormClient 後台上傳按鈕部分
   
    添加引用
   
    using SystemIO;
   
    using SystemServiceModel;
   
    using ITransferPic;
   
    View Code
   
    //執行上傳功能
   
    private void btnUpload_Click(object sender EventArgs e)
   
    {
   
    //pictureBoxLoad(fileName)
   
    //讀取流上傳文件流到服務器
   
    FileStream fs = new FileStream(fileName FileModeOpen FileAccessRead)//創建一個文件並把文件放在文件流裡邊
   
    Stream sm = new MemoryStream()//創建一個濾層流 將文件從第位拷貝到sm中
   
    fsPosition = ;//獲取或設置此流的當前位置
   
    fsCopyTo(sm)
   
    //拷貝完成之後進行上傳
   
    EndpointAddress epAddr = new EndpointAddress(nettcp://localhost:/transferPic//此處也可以用IIS做服務
   
    NetTcpBinding bind = new NetTcpBinding()//綁定方式
   
    bindMaxBufferPoolSize = ;//最大緩沖
   
    bindTransferMode = TransferModeStreamed;//傳輸模式為流式處理
   
    bindMaxReceivedMessageSize = ;//定義了服務端接收Message的最大長度防止文件過大
   
    bindSecurityMode = SecurityModeNone;//安全模式設置為不進行驗證
   
    //創建一個工廠
   
    ITransferPicService proxy = ChannelFactory<ITransferPicService>CreateChannel(bind epAddr)
   
    smPosition = ;
   
    proxySendPic(sm)//WCF客戶端調用該方法 把客戶端sm上傳到服務端去
   
    }
   
    WinFormReceiver 後台
   
    添加引用
   
    using ITransferPic;
   
    using SystemIO;
   
    using SystemServiceModel;
   
    View Code
   
    private void FormReceiver_Load(object sender EventArgs e)
   
    {
   
    Thread myThread = new Thread(ShowPic)//創建一個線程
   
    myThreadIsBackground = true;//設置後台線程(防止主程序關閉後仍在運行)
   
    myThreadStart()//啟動線程
   
    }
   
    public void ShowPic()
   
    {
   
    #region 同客戶端一樣創建WCF客戶端
   
    EndpointAddress epAddr = new EndpointAddress(nettcp://localhost:/transferPic
   
    NetTcpBinding bind = new NetTcpBinding()
   
    bindMaxBufferPoolSize = ;
   
    bindTransferMode = TransferModeStreamed;
   
    bindMaxReceivedMessageSize = ;
   
    bindSecurityMode = SecurityModeNone;
   


    //創建一個通道
   
    ITransferPicService proxy = ChannelFactory<ITransferPicService>CreateChannel(bind epAddr)
   
    #endregion
   
    while (true)
   
    {
   
    Stream streamFromServer = proxyGetPic() //返回一個文件流
   
    MemoryStream ms = new MemoryStream()//濾層流拷貝一份
   
    msPosition = ;
   
    streamFromServerCopyTo(ms)//將該文件流拷貝給到ms;
   
    if (msLength ==
   
    {
   
    SystemThreadingThreadSleep(//百毫秒執行一次
   
    continue;
   
    }
   
    Bitmap tn = new Bitmap(ms)//創建一個位圖把ms變成圖片
   
    pictureBoxImage = tn;
   
    SystemThreadingThreadSleep(//百毫秒執行一次Sleep表示當前線程掛起指定的時間
   
    }
   
    }
   
    四運行程序
   
    打開TransferPicHost 文件中bin目錄啟動TransferPicHostexe此時會彈出一個控制台應用程序的窗體並提示圖片功能已成功啟動!
   
    分別啟動發送端和接收端項目程序
   
    (將WinFormClient 或者 WinFormReceiver 設為啟動項目並啟動另一個項目文件夾bin目錄下的WinFormReceiverexe或者WinFormClientexe
   
    點擊發送端浏覽按鈕 進行選擇圖片之後點擊上傳按鈕這時你會發現客戶端上傳的圖片顯示在了接收端的窗體上程序運行成功


From:http://tw.wingwit.com/Article/program/net/201311/12342.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.