VS2003 C# - 檔案下載 - 使用 WebClient 物件 |
|
digitraveler
初階會員 發表:89 回覆:91 積分:46 註冊:2005-06-01 發送簡訊給我 |
從網路上下載檔案有很多種方式 , 今天要介紹的是使用 WebClient 物件來下載檔案 , 優點是 WebClient 物件使用語法很簡單 , 缺點是有些選項要從 Web Server 打開 ( 否則下載時會出現 Forbidden(403) 錯誤 ) , 若自己無 Web Server 管理權限 , 則不適用 WebClient 物件來下載檔案 ; 反之若你有 Web Server 管理權限 , 如公司內部的 WIN32 程式自動從公司網站更版機制的運用 , 就可以使用 WebClient 物件了 ; 像我是準備研究來給數十台至數百台的 POS 程式(WIN32 程式) 透過內部網路更版機制使用 , Web Server 當然也是由我或資訊人員可以控制的情況下來操作
■ 檔案下載測試 [code c#] using System.Net; // using System.IO; // using System.Threading; // using System.Text; // ..... ..... ..... ..... //--------------------------------------------------------------------------- private void button1_Click(object sender, System.EventArgs e) { string ap_path=System.Windows.Forms.Application.StartupPath; if (!ap_path.EndsWith("\\")) ap_path=ap_path "\\"; string URLAddress="http://digitraveler.homelinux.com/test/WebClient.NEW"; string dl_name=ap_path "WebClient.NEW"; DownloadFile(URLAddress, dl_name); } //--------------------------------------------------------------------------- private bool DownloadFile(string URLAddress, string down_load_file_with_path) { bool r=false; WebClient client = new WebClient(); try { //有些 WEB SERVER 只讓瀏覽器連 , 故要偽裝成瀏覽器時這樣設定 //client.Headers.Add("Accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"); //client.Headers.Add("Accept-Language", "zh-TW"); //client.Headers.Add("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"); //client.Headers.Add("Accept-Encoding","gzip, deflate"); client.DownloadFile(URLAddress,down_load_file_with_path); Stream str = client.OpenRead(URLAddress); StreamReader reader = new StreamReader(str); byte[] mbyte = new byte[100000]; int allmybyte = (int)mbyte.Length; int startmbyte = 0; //statusBar.Text = "DOWNLOAD ..."; while(allmybyte>0) { int m = str.Read(mbyte,startmbyte,allmybyte); if(m==0) break; startmbyte =m; allmybyte-=m; } FileStream fstr = new FileStream(down_load_file_with_path, FileMode.OpenOrCreate,FileAccess.Write); fstr.Write(mbyte,0,startmbyte); long file_size=fstr.Length; str.Close(); fstr.Close(); if (file_size>1200) //用長度判斷是失敗頁面 ? 還是目標檔案 ? { //statusBar.Text = "DOWNLOAD END"; MessageBox.Show("DOWNLOAD OK"); r=true; } else { MessageBox.Show("File Not Exists"); } } catch(WebException exp) { //網址不存在, 或沒有連上 InterNet MessageBox.Show(exp.Message,"Error"); } return r; } [/code] ■ 未來課題 1.若下載檔案不存在 , Web Server 會將失敗結果做成一頁面回傳 , 對 DownLoad() 而言 , 仍有資料 DownLoad 回來 ( 秀出檔案不存在的 HTML 頁面) , 所以無法判斷是下傳成功還是檔案不存在 , 範例-版本更新機制實作 http://tw.myblog.yahoo.com/bruce0211/article?mid=222&prev=225&next=213 編輯記錄
digitraveler 重新編輯於 2009-09-01 10:40:52, 註解 無‧
digitraveler 重新編輯於 2009-09-01 10:43:45, 註解 無‧ digitraveler 重新編輯於 2009-09-01 10:45:56, 註解 無‧ |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
eaglewolf
資深會員 發表:4 回覆:268 積分:429 註冊:2006-07-06 發送簡訊給我 |
手邊沒有VS 2003
不過 url的寫法應該是錯的 改成 string URLAddress="http://digitraveler.homelinux.com/test/WebClient.NEW"; 試試 另外, 到了 .Net Framework 2.0以後 若檔案不存在 會傳回 WebException MSDN .Net 1.1 Download 說明文件 MSDN .Net 2.0 Download 說明文件
------
先查HELP 再查GOOGLE 最後才發問 沒人有義務替你解答問題 在標題或文章中標明很急 並不會增加網友回答速度 Developing Tool: 1.Delphi 6 2.Visual Studio 2005 3.Visual Studio 2008 DBMS: MS-SQL |
digitraveler
初階會員 發表:89 回覆:91 積分:46 註冊:2005-06-01 發送簡訊給我 |
感謝長官指導, URL 前面那個 TAG 是 KTOP 的 程式碼區塊自動幫我加的(應該是BUG), 我程式碼跟長官的寫法是一樣的
".Net Framework 2.0以後, 若檔案不存在, 會傳回 WebException" => 那真是太好了 小弟使用.NET 開發工具只是玩票性質, 公司並不用這個工具開發,所以用 VS2003 都沒換 小弟最近正準備由 2003 直接跳 2010 說 ===================引 用 eaglewolf 文 章=================== 手邊沒有VS 2003 不過 url的寫法應該是錯的 改成 string URLAddress="http://digitraveler.homelinux.com/test/WebClient.NEW"; 試試 另外, 到了 .Net Framework 2.0以後 若檔案不存在 會傳回 WebException MSDN.Net 1.1 Download 說明文件 MSDN .Net 2.0 Download 說明文件 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |