C# SFTP上傳文件

          最近工作中用到一個SFTP上傳文件的功能,因爲客戶端是C#做的就搜索了一些C#SFTP資料,發現網上除了一篇博客外還沒有一篇系列完整的整理文檔,就整理了下,希望大家多提建議,共同提高。

 

sftpSecure File Transfer Protocol的縮寫,安全文件傳送協議。可以爲傳輸文件提供一種安全的加密方法。sftp ftp 有着幾乎一樣的語法和功能。sFTP SSH的一部份,是一種傳輸檔案至 Blogger 伺服器的安全方式。其實在SSH軟件包中,已經包含了一個叫作SFTP(Secure File Transfer Protocol的安全文件傳輸子系統,SFTP本身沒有單獨的守護進程,它必須使用sshd守護進程(端口號默認是22)來完成相應的連接操作,所以從某種意義上來說,SFTP並不像一個服務器程序,而更像是一個客戶端程序。SFTP同樣是使用加密傳輸認證信息和傳輸的數據,所以,使用SFTP是非常安全的。但是,由於這種傳輸方式使用了加密/解密技術,所以傳輸效率比普通的FTP要低得多,如果您對網絡安全性要求更高時,可以使用SFTP代替FTP

 

C#代碼:

         用到了SharpSSH這個第三方動態庫,需要添加Tamir.SharpSSH.dllOrg.Mentalis.Security.dllDiffieHellman.dll三個dll的引用。

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Collections;

using Tamir.SharpSsh;

using Tamir.SharpSsh.jsch;

 

namespace Controller

{

    class SFTPHelper

    {

        private Session m_session;

        private Channel m_channel;

        private ChannelSftp m_sftp;

 

        //host:sftp地址   user:用戶名   pwd:密碼         

        public SFTPHelper(string ip, string port, string user, string pwd)

        {

            Logger.info("SFTP ip:" + ip + " port:" + port);

 

            int serverport = Int32.Parse(port);

 

            JSch jsch = new JSch();

            m_session = jsch.getSession(user, ip, serverport);

 

            MyUserInfo ui = new MyUserInfo();

            ui.setPassword(pwd);

            m_session.setUserInfo(ui);

        }

 

        //SFTP連接狀態         

        public bool Connected { get { return m_session.isConnected(); } }

 

        //連接SFTP         

        public bool Connect()

        {

            try

            {

                if (!Connected)

                {

                    m_session.connect();

                    m_channel = m_session.openChannel("sftp");

                    m_channel.connect();

                    m_sftp = (ChannelSftp)m_channel;

                }

                return true;

            }

            catch(Exception ex)

            {

                Logger.error("SFTP連接異常!" + ex.ToString());

                return false;

            }

        }

 

        //斷開SFTP         

        public void Disconnect()

        {

            if (Connected)

            {

                m_channel.disconnect();

                m_session.disconnect();

            }

        }

 

        //SFTP存放文件         

        public bool Put(string localPath, string remotePath)

        {

            try

            {

                Connect();

                if (this.Connected)

                {

                    Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(localPath);

                    Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(remotePath);

                    m_sftp.put(src, dst);

                    return true;

                }

            }

            catch (Exception ex)

            {

                Logger.error("SFTP上傳文件錯誤!" + ex.ToString());

                return false;

            }

            return false;

        }

 

        //SFTP獲取文件         

        public bool Get(string remotePath, string localPath)

        {

            try

            {

                Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(remotePath);

                Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(localPath);

                m_sftp.get(src, dst);

                return true;

            }

            catch

            {

                return false;

            }

        }

 

        //刪除SFTP文件 

        public bool Delete(string remoteFile)

        {

            try

            {

                m_sftp.rm(remoteFile);

                return true;

            }

            catch

            {

                return false;

            }

        }

 

        //獲取SFTP文件列表         

        public ArrayList GetFileList(string remotePath, string fileType)

        {

            try

            {

                Tamir.SharpSsh.java.util.Vector vvv = m_sftp.ls(remotePath);

                ArrayList objList = new ArrayList();

                foreach (Tamir.SharpSsh.jsch.ChannelSftp.LsEntry qqq in vvv)

                {

                    string sss = qqq.getFilename();

                    if (sss.Length > (fileType.Length + 1) && fileType == sss.Substring(sss.Length - fileType.Length))

                    { objList.Add(sss); }

                    else { continue; }

                }

 

                return objList;

            }

            catch

            {

                return null;

            }

        }

 

    }

 

    //登錄驗證信息         

    public class MyUserInfo : UserInfo

    {

        String passwd;

 

        public String getPassword() { return passwd; }

        public void setPassword(String passwd) { this.passwd = passwd; }

 

        public String getPassphrase() { return null; }

        public bool promptPassphrase(String message) { return true; }

 

        public bool promptPassword(String message) { return true; }

        public bool promptYesNo(String message) { return true; }

        public void showMessage(String message) { }

 

    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章