程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 桌面應用也可以提供HTTP文件下載

桌面應用也可以提供HTTP文件下載

編輯:關於.NET

以往,我們肯定知道,在搞Web應用的時候,我們都可能會遇到提供文件下載的功能需求 ,比如我以前做的一個客戶許可證管理系統,客戶購買ERP系統後,通常我們會根據客戶的機 器的機器碼生成一個許可文件,而這個許可文件是有時間限制的,一年後會過期,過期之後 客戶需要重新獲取許可,以表示繼續使用我們的超級牛B產品,如果客戶不再獲取許可,就表 明客戶不再使用我們的超級牛B產品。

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

不過,我們是否考慮過,如果我們編 寫一個僅僅提供HTTP下載相關的少數功能的應用程序,我們似乎沒有必要大動干戈在機器上 弄個服務器搞個Web站點。通常這種情況,做個小小的窗口程序就可以完事了。所以,就會想 到使用桌面應用程序來提供HTTP下載這想法了。

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

根據這個思路,我們也可以輕松做到提供下載功能,原來和Web 方式是一樣的,就是在響應請求時插入Content-Disposition標頭,值為 attachment;filename=<文件名>的方法就能實現。

private async void 

btnListen_Click(object sender, EventArgs e)  
{  
    HttpListener listener = new HttpListener();  
    listener.Prefixes.Add("http://+:80/download/");  
    listener.Start();  
    btnListen.Enabled = false;  
    HttpListenerContext context = await listener.GetContextAsync();  
    if (context != null)  
    {  
        // 添加Content-Disposition標頭  
        context.Response.AppendHeader("Content-Disposition", 

"attachment;filename=" + WebUtility.UrlEncode( Path.GetFileName

(lblFilePath.Text)));  
        try
        {  
            using (FileStream stream = File.OpenRead(lblFilePath.Text))  
            {  
                // 添加內容說明符  
                context.Response.ContentType = MediaTypeNames.Application.Octet;  
                // 內容長度  
                context.Response.ContentLength64 = stream.Length;  
                // 回發數據給客戶端  
                byte[] buffer = new byte[1024];  
                int n = stream.Read(buffer, 0, buffer.Length);  
                while (n > 0)  
                {  
                    context.Response.OutputStream.Write(buffer, 0, n);  
                    n = stream.Read(buffer, 0, buffer.Length);  
                }  
                context.Response.Close(); //關閉  
            }  
        }  
        catch(Exception ex)  
        {  
            MessageBox.Show(ex.Message);  
        }  
    }  
    listener.Stop(); //停止監聽  
    btnListen.Enabled = true;  
}

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

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

監聽地址為http://+:80/download/,表示HttpListener將監在80端口上的所有主機名接收到 的請求,後面的路徑中加上 download/ 只是為了不與IIS的默認localhost地址沖突,因為我 開啟了IIS。

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

隨後在浏覽器中輸入 http://localhost/download/ ,按回車,就可以測試下載了 。

示例比較簡單,但我認為有實用價值,待會我把源碼上傳到資源區,提供給有需要的朋友 。

查看本欄目

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved