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 方法。
我正在尝试使用 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 方法。