Skip to content
DUONG Phu-Hiep edited this page Jun 2, 2017 · 1 revision

Install the WinSCP package

<?xml version="1.0" encoding="utf-8"?>
<packages>
    <package id="WinSCP" version="5.7.7" targetFramework="net45" />
    ...
</packages>

Upload a file to a SFTP server

private static void SftpUpload(string fileToUpload)
{
    var sessionOptions = new SessionOptions
    {
        Protocol = Protocol.Sftp,
        HostName = ConfigReader.Read("Sftp.Host", "79.116.15.21"),
        PortNumber = ConfigReader.Read("Sftp.Port", 8241),
        UserName = ConfigReader.Read("Sftp.User", "hiep"),
        Password = ConfigReader.Read("Sftp.Password", "123456"),
        SshHostKeyFingerprint = ConfigReader.Read("Sftp.Fingerprint", "ssh-rsa 2048 86:78:56:a3:ff:1f:0f:74:c5:ea:2f:92:49:79:82:39")
    };

    var fileInfo = new FileInfo(fileToUpload);
    if (!fileInfo.Exists)
    {
        throw new InvalidOperationException("Try to upload a non-exist file: " + fileToUpload);
    }

    var tempFile = Path.GetTempFileName();
    File.Copy(fileToUpload, tempFile, true);
    Log.Debug($"copy to tempFile {tempFile}");
    try
    {
        using (Session session = new Session())
        {
            // Connect
            session.Open(sessionOptions);

            // Upload files
            var transferOptions = new TransferOptions
            {
                TransferMode = TransferMode.Automatic
            };

            TransferOperationResult transferResult;

            var remoteFolder = ConfigReader.Read("Sftp.RemoteFolder", "");
            if (!remoteFolder.EndsWith("/"))
            {
                remoteFolder += "/";
            }
            transferResult = session.PutFiles(tempFile, remoteFolder + fileInfo.Name, false, transferOptions);

            // Throw on any error
            transferResult.Check();

            // Print results
            foreach (TransferEventArgs transfer in transferResult.Transfers)
            {
                Log.InfoFormat("Uploaded {0}", transfer.FileName);
            }
        }

    }
    finally
    {
        File.Delete(tempFile);
        Log.Debug($"clean tempFile {tempFile}");
    }
}