CODE-FTP上傳檔案的精簡寫法

上回寫過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);        
    }
}
歡迎推文分享:
Published 09 December 2008 11:40 AM 由 Jeffrey
Filed under: ,


意見

# 小兔 said on 21 September, 2009 11:37 PM

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

# Jeffrey said on 22 September, 2009 04:19 PM

to 小兔,

你指的是類似WebClient.UploadFile() msdn.microsoft.com/.../system.net.webclient.uploadfile.aspx 的功能嗎?

# 小兔 said on 22 September, 2009 08:19 PM

謝謝你的回應

是的只是我是初學者

不是如果給它結合在一起=.="

# 小兔 said on 22 September, 2009 08:25 PM

我用您的方式修了一下,我在單機端執行是沒問題的

只是傳到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;

        }

# Jeffrey said on 23 September, 2009 04:40 PM

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

# SecretDJ said on 22 November, 2009 04:50 AM

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

# 新手 said on 02 January, 2010 05:11 AM

請問一下

" byte[] data = new byte[] { 0x31, 0x32, 0x33 }; "

這段代表的意思是?!

# Jeffrey said on 02 January, 2010 08:12 AM

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

# 新手 said on 10 January, 2010 02:52 AM

恩恩~  謝謝!

可以再請問你一個問題嗎?

為什麼版主您上傳不跟下載一樣用

FtpWebResponse呢?!

感覺這樣兩個會比較好懂...

呵呵><"

如有冒犯敬請原諒!

# Jeffrey said on 10 January, 2010 07:44 AM

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

# 新手 said on 10 January, 2010 09:56 PM

恩恩~  我瞭解了

再請問一個問題喔

也是上面有人問過的問題

請問一下如果用WebClient.Update*()跟Download*()

是不是就不能支援續傳功能了呢?!

(類似這篇:KB-Connection Closed Exception of FtpWebRequest)

# jubo said on 24 January, 2010 05:19 PM

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

# Jeffrey said on 24 January, 2010 06:27 PM

to 新手, 對的,續傳功能需要靠調整FtpWebRequest.ContentOffset完成(blog.darkthread.net/.../tips-write-a-resumable-ftp-download-with-net-2-0.aspx),不在WebClient的管區。

to jubo, 這段程式主要是將執行程式所在那台機器上的檔案上傳到特定FTP Server,不太確定你所謂"上傳sever端的檔案"與"從client端上傳"的定義為何,需要更明確一點的描述。

# jubo said on 24 January, 2010 06:29 PM

試了一下

先把檔案傳到server再傳ftp可行

# jubo said on 25 January, 2010 05:37 PM

分成 client ,webserver ,ftpserver ,而我要把client端的file利用web上傳到ftpserver,web程式在webserver上,我目前的方法是檔案要透過webserver,再到ftpserver,

client >> webserver >> ftpserver

如果是個10M檔案需要傳送兩次,請問有可能直接client >> ftpserver ?

我也是新手>< 勞煩解答

# Jeffrey said on 25 January, 2010 09:54 PM

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

# jubo said on 31 January, 2010 08:43 PM

恩 感謝您的提醒和分享

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 

請輸入以上的數字:

搜尋

Go

<December 2008>
SunMonTueWedThuFriSat
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910
 
RSS
【工商服務】

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


BlogLook Score and Rank

Syndication