使用WebClient實現文件下載

.Net2.0中新增了很多組件,WebClient就是其中一個,功能也很強大,今天拿WebClient做了一個小實驗,只用到了一些很簡單的功能就可以實現以前不好實現的功能,很方便。

    簡單介紹一下WebClient:
    WebClient 類提供向 URI 標識的任何本地、Intranet 或 Internet 資源發送數據以及從這些資源接收數據的公共方法。
    WebClient 類使用 WebRequest 類提供對資源的訪問。WebClient 實例可以通過任何已向 WebRequest.RegisterPrefix 方法註冊的 WebRequest 子代訪問數據。
    注意
    默認情況下,.NET Framework 支持以 http:、https:、ftp:、和 file: 方案標識符開頭的 URI。 

    下面描述用於將數據上載到資源的 WebClient 方法: 
    OpenWrite  檢索一個用於將數據發送到資源的 Stream。
    OpenWriteAsync  檢索 Stream,它在不阻止調用線程的情況下將數據發送到資源。
    UploadData  將字節數組發送到資源,並返回包含任何響應的 Byte 數組。
    UploadDataAsync  在不阻止調用線程的情況下,將 Byte 數組發送到資源。
    UploadFile  將本地文件發送到資源,並返回包含任何響應的 Byte 數組。
    UploadFileAsync  在不阻止調用線程的情況下,將本地文件發送到資源。
    UploadValues  將 NameValueCollection 發送到資源,並返回包含任何響應的 Byte 數組。
    UploadValuesAsync  在不阻止調用線程的情況下,將 NameValueCollection 發送到資源,並返回包含任何響應的 Byte 數組。
    UploadString  在不阻止調用線程的情況下,將 String 發送到資源。
    UploadStringAsync  在不阻止調用線程的情況下,將 String 發送到資源。 

    下面描述從資源下載數據的 WebClient 方法: 
    OpenRead  從資源以 Stream 的形式返回數據。
    OpenReadAsync  在不阻止調用線程的情況下,從資源返回數據。
    DownloadData 從資源下載數據並返回 Byte 數組。
    DownloadDataAsync  在不阻止調用線程的情況下,從資源下載數據並返回 Byte 數組。
    DownloadFile  從資源將數據下載到本地文件。
    DownloadFileAsync  在不阻止調用線程的情況下,將數據從資源下載到本地文件。
    DownloadString  從資源下載 String 並返回 String。
    DownloadStringAsync  在不阻止調用線程的情況下,從資源下載 String。 

    您可以使用 CancelAsync 方法取消尚未完成的異步操作。
    默認情況下,WebClient 實例不發送可選的 HTTP 報頭。如果您的請求需要可選報頭,必須將該報頭添加到 Headers 集合。例如,要在響應中保留查詢,必須添加用戶代理報頭。此外,如果用戶代理標頭丟失,服務器可能返回 500(內部服務器錯誤)。
    在 WebClient 實例中,AllowAutoRedirect 設置爲 true。
    給繼承者的說明派生類應調用 WebClient 的基類實現,以確保派生類按預期方式工作。

    實現源碼爲:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.Net;
  9. using System.IO;

  10. namespace wiindowsFormsApplication
  11. {
  12.     public partial class Form1 : Form
  13.     {
  14.         public Form1()
  15.         {
  16.             InitializeComponent();
  17.             this.textBox1.Text = @"http://dl-sh-ocn-1.pchome.net/0d/bx/koomail50b8.rar";
  18.         }

  19.         WebClient webClient = new WebClient();
  20.         private void btn_down_Click(object sender, EventArgs e)
  21.         {
  22.             
  23.             if (webClient.IsBusy)//是否存在正在進行中的Web請求
  24.             {
  25.                 webClient.CancelAsync();
  26.             }
  27.             //爲webClient添加事件
  28.             webClient.DownloadProgressChanged +=new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
  29.             webClient.DownloadFileCompleted+=new AsyncCompletedEventHandler(webClient_DownloadFileCompleted);
  30.             //開始下載
  31.             webClient.DownloadFileAsync(new Uri(this.textBox1.Text), "aa.rar");
  32.         }
  33.         
  34.         private void webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
  35.         {            
  36.             this.progressBar1.Value = e.ProgressPercentage;
  37.             this.lbl_pro.Text = e.ProgressPercentage.ToString() + "%";
  38.             this.lbl_detail.Text = string.Format("正在下載文件,完成進度{0}/{1}(字節)"
  39.                                 ,e.BytesReceived
  40.                                 ,e.TotalBytesToReceive);
  41.         }

  42.         private void webClient_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
  43.         {
  44.             if (e.Cancelled)
  45.                 MessageBox.Show("下載被取消!");
  46.             else
  47.                 MessageBox.Show("下載完成!");
  48.         }

  49.         private void btn_cancel_Click(object sender, EventArgs e)
  50.         {
  51.             this.webClient.CancelAsync();
  52.             this.webClient.Dispose();
  53.         }
  54.     }
  55. }

運行界面:

發佈了49 篇原創文章 · 獲贊 31 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章