SSH.Net 将文件上传到 SFTP 服务器 returns 异常,"Failure" 消息没有明确的详细信息

SSH.Net Upload file to SFTP server returns exception with "Failure" message without clear details

我正在尝试使用 SSH.NET 将 XML 文件上传到 SFTP 服务器。 (.NetCore 3.1 / VS 2019 / C#)

上传文件的远程文件夹路径是“/testin/”,我们已经确认我们有足够的写权限上传文件到这个文件夹。 我能够在此连接上连接并授权到 SFTP 服务器。 但是,当我尝试上传文件时,异常消息中只有 SSH.net return "Failure",没有其他明确的细节。 我可以毫无问题地下载文件。 通过检查 SSH.NET 中 "Upload" 函数的摘要详细信息,如下所示,它指定它将 return 清除权限错误消息等。 我在网上做了一些搜索,但收效甚微。

    // Summary:
    //     Uploads stream into remote file.
    //
    // Parameters:
    //   input:
    //     Data input stream.
    //
    //   path:
    //     Remote file path.
    //
    //   canOverride:
    //     if set to true then existing file will be overwritten.
    //
    //   uploadCallback:
    //     The upload callback.
    //
    // Exceptions:
    //   T:System.ArgumentNullException:
    //     input is null.
    //
    //   T:System.ArgumentException:
    //     path is null or contains only whitespace characters.
    //
    //   T:Renci.SshNet.Common.SshConnectionException:
    //     Client is not connected.
    //
    //   T:Renci.SshNet.Common.SftpPermissionDeniedException:
    //     Permission to upload the file was denied by the remote host.
    //     -or-
    //     A SSH command was denied by the server.
    //
    //   T:Renci.SshNet.Common.SshException:
    //     A SSH error where System.Exception.Message is the message from the remote host.
    //
    //   T:System.ObjectDisposedException:
    //     The method was called after the client was disposed.
    //
    // Remarks:
    //     Method calls made by this method to input, may under certain conditions result
    //     in exceptions thrown by the stream.
    public void UploadFile(Stream input, string path, bool canOverride, Action<ulong> uploadCallback = null);

这是我的代码: 有什么想法吗?

       using (var sftp = new SftpClient(Host, TcpPort, Username, Password))
        {
            try
            {
                sftp.Connect();

                var localFile = Path.Combine(LocalUploadPath + LocalFilename);

               // var path = $"{localFile.Replace(@"\", "/")}";

                using (var fs = File.OpenRead(localFile))
                {
                    sftp.UploadFile(fs, RemoteUploadRootPath, true);
                }
            }
            catch (Exception ex)
            {
                sftp.Disconnect();

                throw new Exception($"{ex.Message} {ex.InnerException}"
            }
            finally
            {
                sftp.Disconnect();
            }
        }

找到问题了,很简单,在上传路径中,文件路径中没有指定文件名。 :| 这个 link 可能值得与 SSH.NET 分享一些很好的例子: https://csharp.hotexamples.com/examples/Renci.SshNet.Sftp/SftpUploadAsyncResult/Update/php-sftpuploadasyncresult-update-method-examples.html

这是更新后的代码,运行良好:

        using (var sftp = new SftpClient(Host, TcpPort, Username, Password))
        {
            try
            {
                sftp.Connect();

                var localFile = Path.Combine(LocalUploadPath + LocalFilename);
                var remoteFilePath = Path.Combine("/testin/" + LocalFilename);

                using (var fs = File.OpenRead(localFile))
                {
                    sftp.UploadFile(fs, remoteFilePath, true);//, UploadCallBack);
                }
            }
            catch (Exception ex)
            {
                sftp.Disconnect();

                throw new Exception($"{ex.Message} {ex.InnerException}");
            }
            finally
            {
                sftp.Disconnect();
            }
        }

就我而言,我已将路径发送到带有前导正斜杠的 ListDirectory 方法。