Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

FTPS (FTP over SSL) in C#

Tags:

c#

.net

winforms

I need some guidance. I need to develop a customizable FTP in C# that should be configured using App.Config file. Also, the FTP should push the data to any server from any client again depends on config file.

I will appreciate if someone can guide, if there is any API or any other useful suggestion, or move me in the right direction.

like image 493
user421963 Avatar asked Dec 02 '10 04:12

user421963


3 Answers

The accepted answer works, indeed. But I find it too cumbersome to register a prefix, implement an interface, and all that stuff, particularly, if you need it just for one transfer.

FtpWebRequest is not that difficult to use. So I believe that for one-time use, it's better to go this way:

FtpWebRequest request =
    (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip");
request.Credentials = new NetworkCredential("username", "password");
request.EnableSsl = true;
request.Method = WebRequestMethods.Ftp.UploadFile;  

using (Stream fileStream = File.OpenRead(@"C:\local\path\file.zip"))
using (Stream ftpStream = request.GetRequestStream())
{
    fileStream.CopyTo(ftpStream);
}

The key is the EnableSsl property.


For other scenarios, see:
Upload and download a binary file to/from FTP server in C#/.NET

like image 192
Martin Prikryl Avatar answered Sep 21 '22 13:09

Martin Prikryl


You can use FtpWebRequest; however, this is fairly low level. There is a higher-level class WebClient, which requires much less code for many scenarios; however, it doesn't support FTP/SSL by default. Fortunately, you can make WebClient work with FTP/SSL by registering your own prefix:

private void RegisterFtps()
{
    WebRequest.RegisterPrefix("ftps", new FtpsWebRequestCreator());
}

private sealed class FtpsWebRequestCreator : IWebRequestCreate
{
    public WebRequest Create(Uri uri)
    {
        FtpWebRequest webRequest = (FtpWebRequest)WebRequest.Create(uri.AbsoluteUri.Remove(3, 1)); // Removes the "s" in "ftps://".
        webRequest.EnableSsl = true;
        return webRequest;
    }
}

Once you do this, you can use WebClient almost like normal, except that your URIs start with "ftps://" instead of "ftp://". The one caveat is that you have to specify the method parameter, since there won't be a default one. E.g.

using (var webClient = new WebClient()) {
    // Note here that the second parameter can't be null.
    webClient.UploadFileAsync(uploadUri, WebRequestMethods.Ftp.UploadFile, fileName, state);
}
like image 43
Edward Brey Avatar answered Sep 20 '22 13:09

Edward Brey


We use edtFTPnet with good results.

like image 37
Adriaan Stander Avatar answered Sep 19 '22 13:09

Adriaan Stander