C#SFTP上传文件
本文关键字:文件 C#SFTP | 更新日期: 2023-09-27 18:28:51
我正试图将文件上传到linux服务器,但我收到一个错误消息:"Unable to connect to the remote server
"。我不知道我的代码是错误的,还是连接被服务器阻止了——同样的细节,我可以用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;
}
我找到的最好的库/NuGet包是Renci的SSH.NET。打开Nuget软件包管理器并将其安装到您的项目中。
上传可以使用存储的文件或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上传文件的人都有帮助。
您在这里要做的是建立一个FTPS连接,而不是SFTP连接。EnableSsl
选项仅激活TLS上的FTP(因此FTPS)。它使用端口21连接到服务器。
如果你真的在FileZilla中激活了SFTP,你必须使用端口22上的SSH连接来连接到服务器(SFTP=SSH文件传输协议)。最简单的方法应该是使用SharpSSH。
你也可以看看这个问题。