上回寫過CODE-使用C#程式從網站下載檔案, 從chicken的回應學會了WebClient可以一行打死的神技。今天遇到的需求是用FTP上傳檔案到一個需要登入的FTP網站,WebClient可以勝任嗎?

利用new NetworkCredential設定帳號密碼,URI用ftp:開頭,並列上完整的檔案路徑/名稱,三行搞定。

using System;
using System.IO;
using System.Net;
 
public class CSharpLab
{
    public static void Test()
    {
        string userName = "ftpAccount";
        string password = "ftpPassword";
        string uploadUrl = "ftp://myFtpServerHost/someFolder/test.txt";
        byte[] data = new byte[] { 0x31, 0x32, 0x33 };
        WebClient wc = new WebClient();
        wc.Credentials = new NetworkCredential(userName, password);
        wc.UploadData(uploadUrl, data);        
    }
}

Comments

# by 小兔

請問如果我要指定檔案上傳要如何改=.=

# by Jeffrey

to 小兔, 你指的是類似WebClient.UploadFile() http://msdn.microsoft.com/en-us/library/system.net.webclient.uploadfile.aspx 的功能嗎?

# by 小兔

謝謝你的回應 是的只是我是初學者 不是如果給它結合在一起=.="

# by 小兔

我用您的方式修了一下,我在單機端執行是沒問題的 只是傳到server上執行就會出現An exception occurred during a WebClient request 應該是我單機端路徑的寫法有問題=.="我找不出來 try { string userName = "userName"; string password = "password"; string uploadUrl = "ftp://xxxxx/03.rar"; string MyFileName = "d:\\03.rar"; WebClient wc = new WebClient(); wc.Credentials = new NetworkCredential(userName, password); byte[] fildData = wc.UploadFile(uploadUrl, MyFileName); Label1.Text = "傳送成功"; } catch (Exception ex) { Label1.Text = ex.Message; }

# by Jeffrey

to 小兔, "傳到server上執行就會出現錯誤"<--是指你的程式碼是放在ASPX裡,原本在單機用VS2008跑OK,部署到遠端IIS跑會有問題嗎? 若是如此,要確定: 1) 遠端主機上有D:\03.rar 2) ASPX執行身份有權限存取D:\03.rar。

# by SecretDJ

上傳也可以寫成有續傳的嗎

# by 新手

請問一下 " byte[] data = new byte[] { 0x31, 0x32, 0x33 }; " 這段代表的意思是?!

# by Jeffrey

to 新手, 建立一個三個位元組的陣列,內容分別是字母'1'(ASCII = 49,相當於16進位的0x31), '2', '3',上傳後就變成test.txt的檔案內容。test.txt的檔案長度為3,內容為123。

# by 新手

恩恩~ 謝謝! 可以再請問你一個問題嗎? 為什麼版主您上傳不跟下載一樣用 FtpWebResponse呢?! 感覺這樣兩個會比較好懂... 呵呵><" 如有冒犯敬請原諒!

# by Jeffrey

to 新手,習武之人切磋交流,何冒犯之有,呵。我猜你所謂下載用FtpWebResponse指的是我【CODE-使用C#程式從網站下載檔案】一文中第二段程式嗎?(或是我誤會你的語意) 它是被我汰換掉的寫法,原則上,除非有特殊需求(如顯示進度),我建議上傳與下載都用WebClient.Update*(), Download*()糸列解決,一行指令可以解決的事,沒什麼理由要自己多寫十來行Code,除外現成功能不符需求。

# by 新手

恩恩~ 我瞭解了 再請問一個問題喔 也是上面有人問過的問題 請問一下如果用WebClient.Update*()跟Download*() 是不是就不能支援續傳功能了呢?! (類似這篇:KB-Connection Closed Exception of FtpWebRequest)

# by jubo

請問是不是只能上傳sever端的檔案,我試著從client端上傳會失敗,如果是client端要如何上傳 感謝~

# by Jeffrey

to 新手, 對的,續傳功能需要靠調整FtpWebRequest.ContentOffset完成(http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/06/23/tips-write-a-resumable-ftp-download-with-net-2-0.aspx),不在WebClient的管區。 to jubo, 這段程式主要是將執行程式所在那台機器上的檔案上傳到特定FTP Server,不太確定你所謂"上傳sever端的檔案"與"從client端上傳"的定義為何,需要更明確一點的描述。

# by jubo

試了一下 先把檔案傳到server再傳ftp可行

# by jubo

分成 client ,webserver ,ftpserver ,而我要把client端的file利用web上傳到ftpserver,web程式在webserver上,我目前的方法是檔案要透過webserver,再到ftpserver, client >> webserver >> ftpserver 如果是個10M檔案需要傳送兩次,請問有可能直接client >> ftpserver ? 我也是新手>< 勞煩解答

# by Jeffrey

to jubo, 依你所說的情境,我想到的做法是放直接放程式在Client端執行,用WinForm/Silverlight應該都可行,但有一個風險,這樣子FTP的帳號/密碼資訊可能就會被Client端掌握,值得留意。

# by jubo

恩 感謝您的提醒和分享

Post a comment