sftp和ftp的区别
SFTP | FTP | |
连接方式 | sftp是在客户端和服务器之间通过SSH协议建立的安全连接来传输文件,默认端口:22 | ftp是通过tcp协议建立连接,默认端口:21 |
安全性 | 加密 | 不加密 |
效率 | 低 | 高 |
SFTP文件上传
需要引入SSH.NET包,这里遇到一个问题,就是上传的文件名中包含中文时,上传到ftp之后,文件名称会中文乱码
/// <summary>
/// 字符串存到FTP
/// </summary>
/// <param name="host">ftp地址</param>
/// <param name="port">端口</param>
/// <param name="username">账号</param>
/// <param name="password">密码</param>
/// <param name="remotePath">需要上传到ftp的路径,例如/E-data/1.txt</param>
/// <param name="fileContent">文件内容</param>
public static void SftpUploadByFileContent(string host,int port,string username,string password,string remotePath,string fileContent)
{
using (var sftp = new SftpClient(host, port, username, password))
{
sftp.Connect();
using (var stream = sftp.OpenWrite(remotePath))
{
using (var writer = new StreamWriter(stream))
{
writer.Write(fileContent);
}
}
sftp.Disconnect();
}
}
FTP文件上传,
使用WebRequest连接sftp时会报错503
/// <summary>
/// ftp上传文件
/// </summary>
/// <param name="url">ftp路径</param>
/// <param name="username">用户名</param>
/// <param name="password">密码</param>
/// <param name="fileName">需要上传的文件名(全路径)</param>
/// <returns>成功返回true,失败返回false</returns>
public static bool FileUpload(string url,string username,string password,string fileName)
{
try
{
//ftp文件路径
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential(username, password);
// 读取文件到字节数组中
byte[] data = File.ReadAllBytes(fileName);
// 创建一个上传数据的流
Stream requestStream = request.GetRequestStream();
// 将数据写入到流中
requestStream.Write(data, 0, data.Length);
// 关闭流
requestStream.Close();
// 获取服务器的响应
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
// 关闭响应
response.Close();
return true;
}
catch (Exception ex)
{
LogHelper.Write($"文件{fileName}上传失败:" + ex.Message);
LogHelper.Write(ex.StackTrace);
//FTP上传失败时删除本地备份文件
File.Delete(fileName);
}
return false;
}