SFTP使用的三方类库是Renci.SshNet.DLL
SFTP连接大部分网上使用IP地址形式的路径,而我本次使用的是网站形式的。类似sftp.XXX.com
SFTP的操作也类似File文件的操作,网上大部分都是写一个Helper类,创建对象,调用方法,但是直接操作也是直接了当的,本次操作总结就直接写方法,不写Helper类。
1.连接SFTP
根据网上很多的操作 使用Host即IP地址,Port端口号,账号密码即可成功。
而我本次在实践中,用此方法,一直提示无法找到这样的主机。
最终使用它的另一个重载方法
只提供host,账号密码便可以成功连接。
代码如下:
<add key="sFTPPath" value="sftp.XXX.com" /> <add key="sFTPUserName" value="XXXXXX" /> <add key="sFTPPwd" value="XXXXXXXX" />
SftpClient client = new SftpClient(ConfigurationManager.AppSettings["sFTPPath"], ConfigurationManager.AppSettings["sFTPUserName"], ConfigurationManager.AppSettings["sFTPPwd"]);//使用Clinet方法中的HOST NAME PASSWORD方法 client.Connect();//连接Client bool connected = client.IsConnected;//判断是否连接成功
2.连接SFTP中的操作
2.1 SFTP 上传文件,使用UpoladFile方法,对象都是我们一开始创建的Clinet
代码如下:
<add key="sFTPFolder" value="//XXXXX"/>
FileStream fs = File.OpenRead(本地文件);//把文件写成流 string uploadName = ConfigurationManager.AppSettings["sFTPFolder"] + @"/" + name+ ".jgp";//上传的文件地址使用的是相对路径文件 如//XXX/651.JPG client.UploadFile(fs, uploadName);//上传文件 fs.Close();//关闭流 停止占用文件进程
2.2 SFTP 下载操作 使用DownloadFile方法
代码如下:
<add key="sFTPFolder" value="//XXXXXXX"/>
string localpath = Path + @"" + name + ".jgp";//localpath是个完整的路径包含文件名 FileStream fs = File.OpenWrite(localpath); //把文件写成流 client.DownloadFile(ConfigurationManager.AppSettings["sFTPFolder"] + @"/" + name + ".jpg", fs);//SFTP上的文件也是相对路径加文件名 fs.Close();
2.3 类似还有获取SFTP文件列表名(返回List),还有SFTP内移动文件等等 可以自己查看操作。
path如 //XXXX/
PS:操作本地文件时地址都是精确到文件名格式 如:F:\XXX\XXXXXX.jpg
操作SFTP上的路径都是相对地址 如://XXXX/XXXX.jpg
操作文件都是精确到文件名的地址
FTP 则提供一个上传方法
public static void FtpSendFile(string filepath, string path, string ftpip, string username, string password) { try { FileInfo fileInf = new FileInfo(filepath); string uri = path + fileInf.Name; FtpWebRequest reqFTP; reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); reqFTP.Credentials = new NetworkCredential(username, password); reqFTP.KeepAlive = false; reqFTP.Method = WebRequestMethods.Ftp.UploadFile; reqFTP.UseBinary = true; reqFTP.ContentLength = fileInf.Length; reqFTP.Proxy = new WebProxy(); int buffLength = 2048; byte[] buff = new byte[buffLength]; int contentLen; FileStream fs = fileInf.OpenRead(); Stream strm = reqFTP.GetRequestStream(); contentLen = fs.Read(buff, 0, buffLength); while (contentLen != 0) { strm.Write(buff, 0, contentLen); contentLen = fs.Read(buff, 0, buffLength); } strm.Close(); fs.Close(); } catch (Exception ex) { //LogHelper.WriteLog(ex.Message.ToString(), ex); } }
filepath具体文件名地址,path:ftp://XX.XX.XX.XX//XXXXX// (上传到XXXX文件夹下) ip:XXX.XXX.XX.XXX 后面两个参数是账号密码