当前位置: 首页 > 知识库问答 >
问题:

C#SFTP上传文件

鲁斯伯
2023-03-14

我正试图将文件上载到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;
    }

共有2个答案

蒙奇
2023-03-14

您在这里尝试的是建立一个FTPS连接,而不是SFTP连接。EnableSsl选项仅激活TLS上的FTP(因此FTPS)。它使用端口21连接到服务器。

如果您确实在FileZilla中激活了SFTP,则必须使用端口22上的SSH连接才能连接到服务器(SFTP=SSH文件传输协议)。最简单的方法应该是使用SharpSSH。

你也可以看看这个问题。

爱海
2023-03-14

我找到的最好的library/NuGet包是SSH。网由伦西。打开Nuget Package Manager并将其安装到项目中。

上传可以通过存储文件或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";
    
    // 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");
        }
    }
}

这是我用来作为资源让我开始的网站: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上传文件的人都有帮助。

 类似资料:
  • 问题内容: 我已经通过ftp成功上传了文件,但是现在我需要通过SFTP进行上传。我可以成功连接到远程服务器,创建文件并写入文件,但是无法将现有文件从本地服务器上载到远程服务器。ftp_put是否不通过sftp连接触发? 我的代码用来写文件: 有没有人成功抓取本地文件并通过上述方法使用sftp上传?一个例子将不胜感激。 谢谢 问题答案: 通过上述方法(涉及sftp),您可以使用stream_copy

  • 我的本地计算机上有一个文件。我有一个Perl脚本可以通过SFTP连接将此文件复制到远程位置()。

  • 有没有一种方法可以使用Jsch进行异步sftp文件传输,而无需管理自己的线程? 我看到有一个sftprogressmonitor来监控进度,但它只提供了一个回调。 我正在寻找类似Java的write方法: 公共抽象未来写入(ByteBuffer src,长位置) 哪个库提供异步sftp传输?

  • 本文向大家介绍C#实现文件上传以及多文件上传功能,包括了C#实现文件上传以及多文件上传功能的使用技巧和注意事项,需要的朋友参考一下 一、前端搭建 1、前端用到js:uploadify(下载地址:http://www.uploadify.com/download/)、layer (下载地址:http://layer.layui.com/),下载之后把它们放在你的项目里 列如 2、根据你的需要在你项目

  • 本文向大家介绍C++文件上传、下载工具,包括了C++文件上传、下载工具的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C++文件上传下载的实现代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助。

  • 本文向大家介绍c# 用Base64实现文件上传,包括了c# 用Base64实现文件上传的使用技巧和注意事项,需要的朋友参考一下     Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,它是一种基于64个可打印字符来表示二进制数据的方法。     使用base64进行文件上传的具体流程是:前台使用js将文件转换为base64格式,后台通过高级编程语言,将base64格式的文件,转换