FTP文件上传与HTTP代理(FTP File Upload with HTTP Proxy)

2019-08-31 15:09发布

是否有上传文件到FTP服务器后面的HTTP代理服务器时的方法吗?

看来,上传文件没有使用的.Net Web客户端的HTTP代理服务器背后的支持。 ( http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.proxy.aspx )。

如果没有解决办法? 如果没有,你知道一款优秀且免费的FTP库可以使用吗?

编辑 :不幸的是,我没有任何FTP代理连接。

Answer 1:

在主动FTP模式下,服务器发起到所述客户端的数据连接。 如果客户是后面的HTTP代理服务器,这显然是行不通的。 在被动FTP模式是谁启动初始和数据连接的客户端。 由于HTTP代理可以隧道任意传出TCP连接(使用CONNECT方法),它应该有可能通过HTTP代理来访问在被动模式下的FTP服务器。

FtpWebRequest似乎支持被动模式。 不过,我不明白为什么文件下载和目录列表的支持,而文件上传,也使用相同的数据连接,是不是。

有你那证实FtpWebRequest配置为被动模式下通过HTTP代理不工作,通过该目录列表/文件下载工作就好了?



Answer 2:

大多数FTP代理做连接上自己的事情,所以如果你有没有代理,你这样做:

  • 服务器:myftpserver.com
  • 用户:我
  • 密码:PWD

使用FTP代理,你这样做:

  • 服务器:ftpproxy.mydomain.com
  • 用户:me@myftpserver.com
  • 密码:PWD

而且好用它从那里出来。 我使用这一权利本次(尝试调试东西)通鱿鱼代理。

...但你不要有FTP代理....

你有一个SOCKS代理? 这可能工作,但我不知道如果.NET能做到这一点。 否则,说实话,我觉得你被卡住了! FTP是一“奇数”协议中,当相比于HTTP,因为它有一个控制信道(端口21)和一个数据信道(或多于一个的,随机的端口上),所以通过代理打算是....乐趣别的不说!



Answer 3:

我们Rebex的FTP / SSL可以使用HTTP代理。 这不是免费的,但...

// initialize FTP client 
Ftp client = new Ftp();

// setup proxy details  
client.Proxy.ProxyType = FtpProxyType.HttpConnect;
client.Proxy.Host = proxyHostname;
client.Proxy.Port = proxyPort;

// add proxy username and password when needed 
client.Proxy.UserName = proxyUsername;
client.Proxy.Password = proxyPassword;

// connect, login 
client.Connect(hostname, port);
client.Login(username, password);

// do some work 
// ... 

// disconnect 
client.Disconnect();


Answer 4:

一种解决办法是尝试Mono的实现的FtpWebRequest的。 我看了一下它的源代码,它似乎它很容易修改,使所有连接(控制和数据)都是通过HTTP代理隧道。

您建立TCP连接到你的HTTP代理,而不是实际的FTP服务器。 然后,你发送CONNECT myserver:21 HTTP/1.0跟着两个CRLFs(CRLF = \ r \ n)中。 如果代理需要身份验证,则需要使用HTTP / 1.1,也将代理认证标头的凭据。 然后,你需要读取响应的第一线。 如果它与“启动HTTP/1.0 200 ”或“ HTTP/1.1 200 ”,那么你(的代码的其余部分)可以继续使用,就好像它是直接连接到FTP服务器的连接。



Answer 5:

作为.NET框架4.7.2后, FtpWebRequest仍无法上传通过HTTP代理文件 。

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

因此,无论您需要实现自己上传,或者使用第三方FTP库。


例如用WinSCP赋予.NET程序集 ,你可以使用:

// 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();
}

对于TJE选项SessionOptions.AddRawSettings ,看到原始设置 。

更简单的是有GUI的WinSCP 生成C#FTP代码模板你。

需要注意的是WinSCP赋予.NET程序集是不是本地.NET库。 这是相当在一个控制台应用程序薄.NET包装。

(我的WinSCP的作者)



Answer 6:

如果有让你通过FTP上传文件没有 C#的方式那么它也应该在C#中是可能的。 通过是否浏览器或FTP客户端上传的工作?

在一个FTP库中我最喜欢的是.NET FTP客户端库 。



Answer 7:

亚历山大说,HTTP代理可以代理任意流量。 你需要的是一个FTP客户端具有对使用HTTP代理服务器的支持。 亚历山大也是正确的,这将只能在被动模式下工作。

我的雇主销售这样的FTP客户端,但它是一个企业级的工具,仅是作为一个非常大的系统的一部分。

我敢肯定有其他人可用,将更好地满足您的需求。



Answer 8:

将内容上传到FTP的标准方式:通过HTTP代理// URL会使用HTTP PUT请求。 HTTP代理服务器充当HTTP < - >使用FTP打交道时FTP网关://网址,说HTTP请求的客户端和FTP所请求的FTP服务器。

至少鱿鱼HTTP代理支持PUT到ftp:// URL的,不知道其他代理做。

更常见的方式是通过滥用CONNECT方法通过代理esablish隧道。 但是,这往往是不允许的,由于允许对代理双向隧道的安全隐患。



Answer 9:

您好我有同样的问题 - 该决议是创建代理对象,并推导出的DefaultCredentials - 这应该是罚款提供您的应用程序被运行与网络账号 -

FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));

System.Net.WebProxy proxy = System.Net.WebProxy.GetDefaultProxy();
proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;

// set the ftpWebRequest proxy
reqFTP.Proxy = proxy;

这解决了这个问题对我来说。



Answer 10:

该死的这些不自由的应用程序和组件! 这里是我的开源C#代码,可以通过HTTP代理服务器上传文件到FTP。

        public bool UploadFile(string localFilePath, string remoteDirectory)
    {
        var fileName = Path.GetFileName(localFilePath);
        string content;
        using (var reader = new StreamReader(localFilePath))
            content = reader.ReadToEnd();

        var proxyAuthB64Str = Convert.ToBase64String(Encoding.ASCII.GetBytes(_proxyUserName + ":" + _proxyPassword));
        var sendStr = "PUT ftp://" + _ftpLogin + ":" + _ftpPassword
            + "@" + _ftpHost + remoteDirectory + fileName + " HTTP/1.1\n"
            + "Host: " + _ftpHost + "\n"
            + "User-Agent: Mozilla/4.0 (compatible; Eradicator; dotNetClient)\n" + "Proxy-Authorization: Basic " + proxyAuthB64Str + "\n"
            + "Content-Type: application/octet-stream\n"
            + "Content-Length: " + content.Length + "\n"
            + "Connection: close\n\n" + content;

        var sendBytes = Encoding.ASCII.GetBytes(sendStr);

        using (var proxySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
        {
            proxySocket.Connect(_proxyHost, _proxyPort);
            if (!proxySocket.Connected)
                throw new SocketException();
            proxySocket.Send(sendBytes);

            const int recvSize = 65536;
            var recvBytes = new byte[recvSize];
            proxySocket.Receive(recvBytes, recvSize, SocketFlags.Partial);

            var responseFirstLine = new string(Encoding.ASCII.GetChars(recvBytes)).Split("\n".ToCharArray()).Take(1).ElementAt(0);
            var httpResponseCode = Regex.Replace(responseFirstLine, @"HTTP/1\.\d (\d+) (\w+)", "$1");
            var httpResponseDescription = Regex.Replace(responseFirstLine, @"HTTP/1\.\d (\d+) (\w+)", "$2");
            return httpResponseCode.StartsWith("2");
        }
        return false;
    }


Answer 11:

我刚刚有同样的问题。

我的主要目标是将文件上传到FTP。 我不在乎,如果我的流量会去通过代理服务器或没有。

所以我刚刚设置FTPWebRequest.Proxy属性设置为null FTPWebRequest.Create(URI)之后。

和它的工作。 是的,我知道这个方案是不是最大的一个。 而更多的是,我不知道为什么没有它的工作。 但是,我们的目标是完整的,反正。



Answer 12:

我不知道如果所有的HTTP代理以同样的方式工作,但我设法通过简单地创建一个HTTP请求URI的接入资源来欺骗我们的ftp://用户:pass@your.server.com/path 。

可悲的是,创建的HttpWebRequest的你应该使用WebRequest.Create一个实例。 如果你这样做,你不能创建一个FTP HTTP请求://架构。

所以我用了一下反射调用非公共构造它确实是:

var ctor = typeof(HttpWebRequest).GetConstructor(
    BindingFlags.NonPublic | BindingFlags.Instance, 
    null, 
    new Type[] { typeof(Uri), typeof(ServicePoint) }, 
    null);
var req = (WebRequest)ctor.Invoke(new object[] { new Uri("ftp://user:pass@host/test.txt"), null });
req.Proxy = new WebProxy("myproxy", 8080);
req.Method = WebRequestMethods.Http.Put;

using (var inStream = req.GetRequestStream())
{
    var buffer = Encoding.ASCII.GetBytes("test upload");
    inStream.Write(buffer, 0, buffer.Length);
}

using (req.GetResponse())
{
}

您也可以使用其他的方法,比如“删除”执行其他任务。

在我的情况下,它的工作就像一个魅力。



Answer 13:

编号真的没有看到到FTP服务器的HTTP代理和上传之间的连接。 如果使用HTTP代理类多数民众赞成访问http资源槽HTTP代理。 FTP是另一协议和FTP代理使用不同的协议。



文章来源: FTP File Upload with HTTP Proxy
标签: c# proxy ftp