C# - 通过HTTP代理将文件上传到FTP

时间:2015-10-30 16:09:56

标签: c# proxy ftp http-proxy ftpwebrequest

我试图编写一个C#程序,将文件上传到通过代理服务器的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,但它给了我同样的问题。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

FtpWebRequest不支持某些操作的HTTP代理,包括文件上传。它显然是documented on MSDN

  

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

对CodeProject的评论简直是胡说八道。你无法相信你在互联网上找到的一切。

WebClient在内部使用FtpWebRequest,因此您也无法使用它。

无法通过标准.NET框架库的HTTP代理将文件上传到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的作者)