27

I am trying to upload files to a linux server but I am getting an error saying: "Unable to connect to the remote server". I dont know if my code is wrong or the connection is blocked by the server - with the same details I can connect the server with FileZilla.

My code:

    const string UserName = "userName";
    const string Password = "password";
    const string ServerIp = "11.22.333.444/";

    public bool UploadFile(HttpPostedFileBase file)
    {
        string fileName = file.FileName;

        var serverUri = new Uri("ftp://" + ServerIp + fileName);


        // the serverUri should start with the ftp:// scheme.
        if (serverUri.Scheme != Uri.UriSchemeFtp)
            return false;

        try
        {
            // get the object used to communicate with the server.
            var request = (FtpWebRequest)WebRequest.Create(serverUri);

            request.EnableSsl = true;
            request.UsePassive = true;
            request.UseBinary = true;
            request.Credentials = new NetworkCredential(UserName, Password);
            request.Method = WebRequestMethods.Ftp.UploadFile;

            // read file into byte array
            var sourceStream = new StreamReader(file.InputStream);
            byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
            sourceStream.Close();
            request.ContentLength = fileContents.Length;

            // send bytes to server
            Stream requestStream = request.GetRequestStream();
            requestStream.Write(fileContents, 0, fileContents.Length);
            requestStream.Close();

            var response = (FtpWebResponse)request.GetResponse();
            Console.WriteLine("Response status: {0}", response.StatusDescription);
        }
        catch (Exception exc)
        {
            throw exc;
        }
        return true;
    }
Eyal
  • 4,653
  • 9
  • 40
  • 56
  • EnableSsl for Sftp. But I am trying to understand that the server uses SSH shell, SSH and SFTP are two different things so it wont work. – Eyal Nov 02 '14 at 15:42

2 Answers2

57

The best library/NuGet Package that I found was SSH.NET by Renci. Open up Nuget Package Manager and install this into your project.

The upload can be done with a stored file or a byte[] file.


Upload byte[] file

// you could pass the host, port, usr, and pass as parameters
public void FileUploadSFTP()
{
    var host = "whateverthehostis.com";
    var port = 22;
    var username = "username";
    var password = "passw0rd";
    
    // http://stackoverflow.com/questions/18757097/writing-data-into-csv-file/39535867#39535867
    byte[] csvFile = DownloadCSV(); // Function returns byte[] csv file

    using (var client = new SftpClient(host, port, username, password))
    {
        client.Connect();
        if (client.IsConnected)
        {
            Debug.WriteLine("I'm connected to the client");

            using (var ms = new MemoryStream(csvFile))
            {
                client.BufferSize = (uint)ms.Length; // bypass Payload error large files
                client.UploadFile(ms, GetListFileName());
            }
        }
        else
        {
            Debug.WriteLine("I couldn't connect");
        }
    }
}

Upload From a Stored File

This was the site that I used as a resource to get me started: http://blog.deltacode.be/2012/01/05/uploading-a-file-using-sftp-in-c-sharp/

It's written for uploading files.

// you could pass the host, port, usr, pass, and uploadFile as parameters
public void FileUploadSFTP()
{
    var host = "whateverthehostis.com";
    var port = 22;
    var username = "username";
    var password = "passw0rd";

    // path for file you want to upload
    var uploadFile = @"c:yourfilegoeshere.txt"; 

    using (var client = new SftpClient(host, port, username, password))
    {
        client.Connect();
        if (client.IsConnected)
        {
            Debug.WriteLine("I'm connected to the client");

            using (var fileStream = new FileStream(uploadFile, FileMode.Open))
            {
                
                client.BufferSize = 4 * 1024; // bypass Payload error large files
                client.UploadFile(fileStream, Path.GetFileName(uploadFile));
            }
        }
        else
        {
            Debug.WriteLine("I couldn't connect");
        }
    }
}

Hopefully this is helpful for anyone trying to upload a file using SFTP in C#.

Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992
Trevor Nestman
  • 2,456
  • 19
  • 26
8

What you are trying to do here is to establish a FTPS connection which is not a SFTP connection. The EnableSsl option only activates FTP over TLS (so FTPS). It uses Port 21 to connect to the server.

If you really have activated SFTP in FileZilla, you have to use an SSH connection on port 22 to connect to the server (SFTP = SSH File Transfer Protocol). The easiest method to obtain this should be using SharpSSH.

You can also take a look into this question.

Community
  • 1
  • 1