我正在使用Renci SSH.NET在SFTP上上传一个文件。
连接:
SftpClient
的IsConnected
返回true。上传:
1)使用SftpClient
的UploadFile
方法:
client.UploadFile(fileStream, "/Path/" + fileName, null);
...I获得一个Renci.SshNet.Common.SftpPathNotFoundException
:“系统找不到指定的路径。”
SftpClient
的WorkingDirectory
--但这转换成了一串看上去像中文的字符,而且也不起作用。2)采用SftpClient
的BeginUploadFile
方法:
client.BeginUploadFile(fileStream, "/Path/" + fileName, asyncCallback, null, UpdateUploadProgress);
...I没有错误/异常,但是:
aSyncCallback
和uploadCallback
似乎不起作用3)使用FileZilla,我可以上传得很好(使用与上面完全相同的目标路径:"/ path /Filename.txt")
我的代码:
var connectionInfo = new ConnectionInfo(IpAddress,
Port,
UserName,
new PasswordAuthenticationMethod(UserName, Password),
new PrivateKeyAuthenticationMethod("rsa.key"));
connectionInfo.Encoding = Encoding.Unicode;
using (var client = new SftpClient(connectionInfo))
{
client.Connect();
if (client.IsConnected)
{
Console.WriteLine("SSH-client is connected");
}
var fileStream = new FileStream(FileMaker.GetFullyQualifiedPath(), FileMode.Open);
client.BufferSize = 4 * 1024;
string fileName = new FileMaker().GetFileName();
//client.UploadFile(fileStream, "/Path/" + fileName, null);
AsyncCallback asyncCallback = new AsyncCallback(NotifyUploadComplete);
client.BeginUploadFile(fileStream, "/Path/" + fileName, asyncCallback, null, UpdateUploadProgress);
client.Disconnect();
}
回调处理程序:
private void UpdateUploadProgress(ulong uploaded)
{
MainViewModel mainViewModel = (MainViewModel)System.Windows.Application.Current.FindResource("mainViewModel");
mainViewModel.UploadProgress = uploaded;
}
private void NotifyUploadComplete(IAsyncResult result)
{
MessageBox.Show("File uploaded.", "File uploaded");
}
UPDATE:我做了一个最小的例子并测试了它(相同的结果)。
使用UploadFile:
var connectionInfo = new ConnectionInfo(IpAddress,
Port,
UserName,
new PasswordAuthenticationMethod(UserName, Password),
new PrivateKeyAuthenticationMethod("rsa.key"));
connectionInfo.Encoding = Encoding.Unicode;
using (var client = new SftpClient(connectionInfo))
{
client.Connect();
if (client.IsConnected)
{
Console.WriteLine("SSH-client is connected");
}
var fileStream = new FileStream(@"C:\File.txt", FileMode.Open);
client.BufferSize = 4 * 1024;
client.UploadFile(fileStream, "/SSHUsersPath/File.txt", null);
//AsyncCallback asyncCallback = new AsyncCallback(NotifyUploadComplete);
//client.BeginUploadFile(fileStream, "/SSHUsersPath/File.txt", asyncCallback, null, UpdateUploadProgress);
client.Disconnect();
}
下面是请求的FileZilla日志文件的摘录:
2017-09-21 10:08:36 11252 1状态:连接到sshserv.CENSORED.com 2017-09-21 10:08:36 11252命令: pwd 2017-09-21 10:08:36 11252 1响应:当前目录是:" /SSHUsersPath“2017-09-21 10:08:36 11252 1命令: ls 2017-09-21 10:08:37 11252 12017年-09-21 10:08:58 11252 3回应: fzSftp启动protocol_version=8 2017-09-21 10:08:58 11252 3命令:打开"CENSORED@sshserv.CENSORED.com“22 2017-09-21 10:59 11252 3命令:信任新主机:1 2017-09-21 10:00 11252 3命令:通行证:* 2017- 21 10:00 11252 3状态:连接到sshserv.CENSORED.com 2017-09-21 10:00 11252 3状态:开始上传C:\File.txt 2017-09-21 10:09:00 11252 3命令: cd "/SSHUsersPath“2017-09-21 10:01 11252 3响应:新目录是:"/SSHUsersPath”2017-09-21 10:01 11252 3命令:放置"C:\File.txt“C:\File.txt "File.txt”2017-09-21 10:01 11252 3命令: local:C:\File.txt => remote:/SSHUsersPath/File.txt 2017-09-21 10:01 11252 3状态:文件传输成功,传输4个字节在1秒,2017-09-21 10:09:01 11252 3状态:检索目录列表的“/SSHUsersPath”.命令: ls 2017-09-21 10:01 11252 3状态:列表目录/SSHUsersPath 2017-09-21 10:09:02 11252 3
发布于 2017-09-21 12:58:28
主要问题是:
connectionInfo.Encoding = Encoding.Unicode;
Encoding.Unicode
是UTF-16.任何SFTP服务器都不会处理UTF-16编码的文件名.SFTP服务器应该使用UTF-8.因此,SSH.NET默认为Encoding.UTF8
。如果使用UTF-8,服务器会损坏文件名中的非ascii字符( .Encoding
是关于文件名,而不是文件内容),这肯定是因为SFTP被破坏了,并且使用了一些遗留编码。但可以肯定的是,不是UTF-16。它是一些ISO*
编码或Windows-*
编码。
另一个问题是,当您使用BeginUploadFile
时,您不会等待它完成并立即断开连接。
https://stackoverflow.com/questions/46325986
复制相似问题