桌面應用也能夠提供HTTP文件下載

以往,咱們確定知道,在搞Web應用的時候,咱們均可能會遇到提供文件下載的功能需求,好比我之前作的一個客戶許可證管理系統,客戶購買ERP系統後,一般咱們會根據客戶的機器的機器碼生成一個許可文件,而這個許可文件是有時間限制的,一年後會過時,過時以後客戶須要從新獲取許可,以表示繼續使用咱們的超級牛B產品,若是客戶再也不獲取許可,就代表客戶再也不使用咱們的超級牛B產品。瀏覽器

後來一想,是啊,倒不如我們弄個Web程序,讓客戶自行登入,輸入機器碼後,自動生成許可文件,而後客戶在頁面上點擊下載就好了。提供下載功能其實很常見,像許多軟件下載站等。服務器

不過,咱們是否考慮過,若是咱們編寫一個僅僅提供HTTP下載相關的少數功能的應用程序,咱們彷佛沒有必要大動干戈在機器上弄個服務器搞個Web站點。一般這種狀況,作個小小的窗口程序就能夠完事了。因此,就會想到使用桌面應用程序來提供HTTP下載這想法了。async

 

其實,這個實現起來並不複雜,System.Net命名空間下提供了一個HttpListener類,它可監聽客戶端傳入的HTTP請求,而後返回一個HttpListenerContext對象,再經過HttpListenerContext對象能夠獲得用於處理請求/響應有關的對象。測試

根據這個思路,咱們也能夠輕鬆作到提供下載功能,原來和Web方式是同樣的,就是在響應請求時插入Content-Disposition標頭,值爲attachment;filename=<文件名>的方法就能實現。編碼

[csharp]  view plain  copy
 
  1. private async void btnListen_Click(object sender, EventArgs e)  
  2. {  
  3.     HttpListener listener = new HttpListener();  
  4.     listener.Prefixes.Add("http://+:80/download/");  
  5.     listener.Start();  
  6.     btnListen.Enabled = false;  
  7.     HttpListenerContext context = await listener.GetContextAsync();  
  8.     if (context != null)  
  9.     {  
  10.         // 添加Content-Disposition標頭  
  11.         context.Response.AppendHeader("Content-Disposition", "attachment;filename=" + WebUtility.UrlEncode( Path.GetFileName(lblFilePath.Text)));  
  12.         try  
  13.         {  
  14.             using (FileStream stream = File.OpenRead(lblFilePath.Text))  
  15.             {  
  16.                 // 添加內容說明符  
  17.                 context.Response.ContentType = MediaTypeNames.Application.Octet;  
  18.                 // 內容長度  
  19.                 context.Response.ContentLength64 = stream.Length;  
  20.                 // 回發數據給客戶端  
  21.                 byte[] buffer = new byte[1024];  
  22.                 int n = stream.Read(buffer, 0, buffer.Length);  
  23.                 while (n > 0)  
  24.                 {  
  25.                     context.Response.OutputStream.Write(buffer, 0, n);  
  26.                     n = stream.Read(buffer, 0, buffer.Length);  
  27.                 }  
  28.                 context.Response.Close(); //關閉  
  29.             }  
  30.         }  
  31.         catch(Exception ex)  
  32.         {  
  33.             MessageBox.Show(ex.Message);  
  34.         }  
  35.     }  
  36.     listener.Stop(); //中止監聽  
  37.     btnListen.Enabled = true;  
  38. }  

在設置filename時將文件名加上WebUtility.UrlEncode進行編碼是防止當文件名中包含中文時呈現亂碼。spa

而發送文件給客戶端就簡單多了,和普通的流操做沒有區別,把從文件中讀到的數據寫入Response.OutputStream流中便可,發送完畢後,調用Close方法關閉HttpListenerResponse對象,所以處理已經完成,沒有必再開着它佔用資源。.net

監聽地址爲http://+:80/download/,表示HttpListener將監在80端口上的全部主機名接收到的請求,後面的路徑中加上 download/ 只是爲了避免與IIS的默認localhost地址衝突,由於我開啓了IIS。code

運行後,選擇一個文件,而後點擊按鈕開始監聽。對象

 

隨後在瀏覽器中輸入 http://localhost/download/ ,按回車,就能夠測試下載了。blog

相關文章
相關標籤/搜索