2015-10-11 27 views
4

我有一個需要創建一個C#應用程序,該應用程序將基於在app.config文件中輸入的設置將一個excel文件上傳到「FTP/SFTP」使用「ftp \ ftps \ sftp」)。FTP/FTPS/SFTP之間的區別 - 可配置連接到其中任何一個

我對這些協議很新鮮,有這麼多的疑惑。

  1. FTP和SFTP服務器有什麼區別?
  2. 是否可以使用SFTP連接方法訪問FTP服務器,反之亦然(指導使用Rebex庫連接到SFTP)?
  3. 如何改變以下FTP上傳方法FTPS

代碼如下:

string PureFileName = new FileInfo(fileName).Name; 
string uploadUrl = String.Format("ftp://{0}/{1}", ftpurl, PureFileName); 
FtpWebRequest req = (FtpWebRequest)FtpWebRequest.Create(uploadUrl); 
req.Proxy = null; 
req.Method = WebRequestMethods.Ftp.UploadFile; 
req.Credentials = new NetworkCredential(user, pass); 
req.UseBinary = true; 
req.UsePassive = true; 
byte[] data = File.ReadAllBytes(fileName); 
req.ContentLength = data.Length; 
Stream stream = req.GetRequestStream(); 
stream.Write(data, 0, data.Length); 
stream.Close(); 
FtpWebResponse res = (FtpWebResponse)req.GetResponse(); 

是不是像FTP改變url到FTPS?

string uploadUrl = String.Format("ftps://{0}/{1}", ftpurl, PureFileName); 
+0

要了解有關SFTP和FTP/FTPS的區別,歡迎閱讀我關於CodeGuru的文章:http://www.codeguru.com/csharp/.net/net_general/internet/article.php/c14329/FTPS-vs -SFTP-What-to-Choose.htm –

回答

6
  • FTP:舊的文件傳輸協議(RFC959)。防火牆存在問題,因爲它使用動態端口,並且在應用級別交換有關這些端口的信息。
  • FTPS:舊的FTP協議,但增加了對TLS的支持。防火牆更成問題,因爲這些防火牆不能再查看應用程序級別以找出使用的端口。
  • SFTP:完全不同的東西,因爲它使用SSH協議傳輸文件。沒有防火牆問題。

如果你的代碼能夠處理FTPS,它通常也能夠處理FTP,但是有很多代碼只能處理FTP而不能處理FTPS。由於SFTP是一種完全不同的協議代碼,處理FTP/FTPS通常無法執行SFTP。並且SFTP處理代碼不會執行FTP/FTPS。也有例外,即FileZilla可以在單個應用程序中處理所有這些協議。

至於使用FTPS和FtpWebRequests,請參見msdn。使用SFTP與FtpWebRequests是不可能的,但有other libraries

1
  1. 可以通過您的問題下方徘徊在標籤會發現很容易。 FTP和SFTP是完全不同的協議。 FTPS是FTP加密

  2. 沒有

  3. 如果您正在使用WebRequestMethods.Ftp.UploadFile;它不會對SFTP工作,也許對FTPS,但必須有一些選項來打開加密的。

+0

@你可以給m e一些代碼示例來實現ftps上傳 – sajju

5

SFTPFTP/FTPS是兩個完全不同的協議。您不能使用FTP上傳到SFTP服務器,反之亦然。 FTPS是基於TLS/SSL會話的FTP。大多數FTP客戶端/庫也支持FTPS。

只有FTP(S)由.NET框架本身支持(通過FtpWebRequest class)。要使用FTPS,請使用ftps:// URL或將FtpWebRequest.EnableSsl設置爲true

.NET框架中沒有對SFTP的本機支持。你必須使用3rd party library for the SFTP


有一些庫爲所有這些協議提供統一接口。

例如對於WinSCP .NET assembly,(幾乎)只是將SessionOptions.Protocol設置爲Protocol.FTPProtocol.SFTP

SFTP協議:

SessionOptions sessionOptions = new SessionOptions { 
    Protocol = Protocol.Sftp, 
    HostName = "example.com", 
    UserName = "user", 
    Password = "mypassword", 
    SshHostKeyFingerprint = "ssh-rsa 2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx" 
}; 

Session session = new Session(); 
session.Open(sessionOptions); 

FTP協議:

SessionOptions sessionOptions = new SessionOptions { 
    Protocol = Protocol.Ftp, 
    HostName = "example.com", 
    UserName = "user", 
    Password = "mypassword", 
}; 

Session session = new Session(); 
session.Open(sessionOptions); 

FTPS協議:

SessionOptions sessionOptions = new SessionOptions { 
    Protocol = Protocol.Ftp, 
    FtpSecure = FtpSecure.Explicit, 
    HostName = "example.com", 
    UserName = "user", 
    Password = "mypassword", 
}; 

Session session = new Session(); 
session.Open(sessionOptions); 

如果您需要進行會話配置,你可以把它易於使用SessionOptions.ParseUrl,它允許您使用您在配置文件中設置的單個連接字符串(URL)配置主要會話選項。

SessionOptions sessionOptions = new SessionOptions(); 
sessionOptions.ParseUrl(connectionString); 

Session session = new Session(); 
session.Open(sessionOptions); 

連接字符串可以像:

你可以有WinSCP (GUI) generate the URL (connection string) for you


請注意,WinSCP .NET程序集不是本機.NET庫。它只是一個圍繞控制檯應用程序的簡單.NET包裝(WinSCP)。

可能有本地.NET庫支持具有統一接口的所有協議。但我不知道有任何免費的。

(我的WinSCP的作者)

0

顯式

// Setup session options 
      SessionOptions sessionOptions = new SessionOptions 
      { 
       Protocol = Protocol.Ftp, 
       HostName = "address.co.za", 
       FtpSecure = FtpSecure.Explicit, 
       UserName = "username", 
       Password = "pass", 
       TlsHostCertificateFingerprint = "xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx" 
      }; 

FTPS如果您需要下載幫助,如果你想獲得的文件列表的上傳與我聯繫

相關問題