2015-10-30 69 views
1

我想寫一個C#程序來上傳文件到FTP通過代理。C# - 通過HTTP代理上傳文件到FTP

這是我寫的代碼:

public new bool Upload(string localFilePath, string pathUpload) 
{ 
    Stream FStream = null; 
    bool retval = false; 
    FileStream FlStream; 

    try 
    { 
     FtpWebRequest FtpRequest = 
        (FtpWebRequest) FtpWebRequest.Create(Uri + pathUpload); 
     FtpRequest.Credentials = new NetworkCredential(User, Password); 

     if (ProxyAddress != "" && ProxyAddress != null) 
     { 
      WebProxy ftpProxy = new WebProxy(); 
      ftpProxy.Address = new System.Uri(ProxyAddress); 
      ftpProxy.Credentials = 
        new System.Net.NetworkCredential(ProxyUserId, ProxyPassword); 
      FtpRequest.Proxy = ftpProxy; 
     } 

     FtpRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile; 

     FStream = FtpRequest.GetRequestStream(); 

     FileStream fs = File.OpenRead(localFilePath); 
     byte[] buffer = new byte[fs.Length]; 
     fs.Read(buffer, 0, buffer.Length); 
     fs.Close(); 

     FStream.Write(buffer, 0, buffer.Length); 

     FStream.Close(); 
     FStream.Dispose(); 

     return retval = true; 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e.Message); 
     Console.WriteLine(e.ToString()); 
     return false; 
    } 
} 

如果我通過它說,使用HTTP代理時,不支持FTP命令代理地址。

我已經嘗試強制FtpRequest.Proxy = null建議其他地方(例如http://www.codeproject.com/Questions/332730/FTP-proxy-problem-in-Csharp-application),但它給了我例外「無法連接到遠程服務器」。

我也嘗試使用WebClient類而不是FtpWebRequest,但它給了我同樣的問題。

在此先感謝您的幫助。

回答

3

FtpWebRequest不支持某些操作(包括文件上載)的HTTP代理。顯然是documented on MSDN

如果指定的代理是HTTP代理,則只支持DownloadFile,ListDirectory和ListDirectoryDe​​tails命令。

對CodeProject的評論簡直是無稽之談。你無法相信你在互聯網上找到的一切。

WebClient內部使用FtpWebRequest,所以你也不能使用它。

無法通過HTTP代理使用標準.NET框架庫將文件上傳到FTP。

您必須使用第三方FTP庫。


例如與WinSCP .NET assembly,你可以使用:

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

// Configure proxy 
sessionOptions.AddRawSettings("ProxyMethod", "3"); 
sessionOptions.AddRawSettings("ProxyHost", "proxy"); 

using (Session session = new Session()) 
{ 
    // Connect 
    session.Open(sessionOptions); 

    // Upload file 
    string localFilePath = @"C:\path\file.txt"; 
    string pathUpload = "/file.txt"; 
    session.PutFiles(localFilePath, pathUpload).Check(); 
} 

對於選項SessionOptions.AddRawSettings,見raw settings

(我是WinSCP的作者)