首頁 > 軟體

JSch教學使用sftp協定實現伺服器檔案載操作

2022-03-07 22:00:02

Jsch是什麼?

JSch 是SSH2的一個純Java實現。它允許你連線到一個sshd 伺服器,使用埠轉發,X11轉發,檔案傳輸等等。你可以將它的功能整合到你自己的 程式中。同時該專案也提供一個J2ME版本用來在手機上直連SSHD伺服器

Jsch功能很強大,博主這裡主要用來做檔案操作

怎麼使用?

新增jar依賴

<dependency>
 <groupId>com.jcraft</groupId>
 <artifactId>jsch</artifactId>
 <version>0.1.53</version>
</dependency>

我把我的SftpUtil貼下面了,註釋還算清楚

/**
 * Content :sftp協定檔案上傳下載
 * Created by kl on 2016/5/6.
 */
public class SftpUtil {
    /**
     * 上傳檔案到指定伺服器
     * @param ip 連線ip
     * @param user 使用者名稱
     * @param psw 密碼
     * @param port 埠 <=0 為預設埠
     * @param fielPath 上傳的伺服器路徑
     * @param serverFileName 伺服器儲存的檔名
     * @param instream 要上傳的檔案流
     * @throws Exception
     */
    public static void sftpFileUpload(String ip,int port, String user, String psw, String fielPath,String serverFileName,InputStream instream) throws Exception {
        Session session =getSession( ip,  user,  psw,  port);
        Channel channel = null;
        try {
            //建立sftp通訊通道
            channel = (Channel) session.openChannel("sftp");
            channel.connect(1000);
            ChannelSftp sftp = (ChannelSftp) channel;
            //進入伺服器指定的資料夾
            sftp.cd(fielPath);
            OutputStream outstream = sftp.put(serverFileName);
            byte b[] = new byte[1024*200];//每次傳輸200k
            int n;
            while ((n = instream.read(b)) != -1) {
                outstream.write(b, 0, n);
            }
            outstream.flush();
            outstream.close();
            instream.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            session.disconnect();
            if (channel!=null)channel.disconnect();
        }
    }
    /**
     * 從指定伺服器下載檔案到本地
     * @param ip 連線ip
     * @param user 使用者名稱
     * @param psw 密碼
     * @param port 埠 <=0 為預設埠
     * @param fielPath 伺服器檔案路徑
     * @param serverFileName 要下載的檔名
     * @param outputStream 輸出到原生的檔案流
     * @throws Exception
     */
    public static void sftpFileDownload(String ip,int port, String user, String psw, String fielPath,String serverFileName,OutputStream outputStream) throws Exception {
        Session session =getSession( ip,  user,  psw,  port);
        Channel channel = null;
        try {
            //建立sftp通訊通道
            channel = (Channel) session.openChannel("sftp");
            channel.connect(1000);
            ChannelSftp sftp = (ChannelSftp) channel;
            //進入伺服器指定的資料夾
            sftp.cd(fielPath);
            sftp.get(serverFileName,outputStream);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            session.disconnect();
            if (channel!=null)channel.disconnect();
        }
    }
    /**
     * 刪除伺服器指定檔案
     * @param ip 連線ip
     * @param user 使用者名稱
     * @param psw 密碼
     * @param port 埠 <=0 為預設埠
     * @param fielPath 伺服器檔案路徑
     * @param serverFileName 要刪除的檔名
     * @throws Exception
     */
    public static void sftpFileDelete(String ip,int port, String user, String psw, String fielPath,String serverFileName) throws Exception {
        Session session =getSession( ip,  user,  psw,  port);
        Channel channel = null;
        try {
            //建立sftp通訊通道
            channel = (Channel) session.openChannel("sftp");
            channel.connect(1000);
            ChannelSftp sftp = (ChannelSftp) channel;
            //進入伺服器指定的資料夾
            sftp.cd(fielPath);
            sftp.rm(serverFileName);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            session.disconnect();
            if (channel!=null)channel.disconnect();
        }
    }
    /**
     * 檢視指定目錄所有檔案
     * @param ip
     * @param user
     * @param psw
     * @param port
     * @param fielPath
     * @throws Exception
     */
    public static Vector  seeServerFileList(String ip, int port,String user, String psw,  String fielPath)throws Exception{
        Session session =getSession( ip,  user,  psw,  port);
        Channel channel = null;
        Vector v=null;
        try {
            //建立sftp通訊通道
            channel = (Channel) session.openChannel("sftp");
            channel.connect(1000);
            ChannelSftp sftp = (ChannelSftp) channel;
            //進入伺服器指定的資料夾
            sftp.cd(fielPath);
            //列出伺服器指定的檔案列表
             v = sftp.ls(fielPath);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            session.disconnect();
            if (channel!=null)channel.disconnect();
        }
        return  v;
    }
    /**
     * 連線伺服器
     * @param ip 伺服器地址
     * @param user 使用者名稱
     * @param psw  密碼
     * @param port  連線埠
     * @return
     * @throws Exception
     */
    public static Session getSession(String ip, String user, String psw, int port)throws Exception{
        Session session = null;
        JSch jsch = new JSch();
        if (port <= 0) {
            //連線伺服器,採用預設埠
            session = jsch.getSession(user, ip);
        } else {
            session = jsch.getSession(user, ip, port);
        }
        //如果伺服器連線不上,則丟擲異常
        if (session == null) {
            throw new Exception("sftp session is null");
        }
        session.setPassword(psw);//設定密碼
        //設定登陸超時時間
        session.connect(30000);//30s
        return  session;
    }
}

以上就是JSch教學使用sftp協定實現伺服器檔案上傳下載操作的詳細內容,更多關於JSch sftp協定伺服器檔案上傳下載的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com