C# SFTP上传文件

27

我尝试将文件上传到Linux服务器,但出现错误消息:无法连接到远程服务器。我不知道是我的代码有问题还是连接被服务器阻止了。使用相同的详细信息,我可以通过FileZilla连接服务器。

我的代码:

    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;
    }

启用SFTP的SSL。但我正在尝试理解服务器使用SSH shell,SSH和SFTP是两个不同的东西,所以它不起作用。 - Eyal
2个回答

58

我发现最好的库/ NuGet包是Renci的SSH.NET。打开Nuget Package Manager并将其安装到您的项目中。

上传可以使用存储文件或byte[]文件完成。


上传byte[]文件

// 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";
    
    // https://dev59.com/MGMl5IYBdhLWcg3wBzDy#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");
        }
    }
}

从存储的文件上传

这是我用作资源开始的网站:http://blog.deltacode.be/2012/01/05/uploading-a-file-using-sftp-in-c-sharp/

它是用于上传文件编写的。

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

希望这对于任何试图在C#中使用SFTP上传文件的人有所帮助。


太好了,这对我有用。我之前尝试使用FtpWebRequest,但它无法与sftp一起使用,而这个可以。 - Arvind Krmar

8
你在这里尝试建立一个FTPS连接,而不是SFTP连接。 EnableSsl选项仅激活TLS上的FTP(因此为FTPS)。 它使用端口21连接到服务器。
如果您真的已在FileZilla中激活了SFTP,则必须使用端口22上的SSH连接才能连接到服务器(SFTP = SSH文件传输协议)。 获得这种连接的最简单方法应该是使用SharpSSH
您还可以参考此问题

上传文件时可以忽略某些文件吗? - reguieg younes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接