sftp工具类

本文介绍如何在Java环境中创建一个SFTP工具类,用于实现与远程服务器的安全文件传输。内容涉及使用JSch库进行SFTP连接,上传和下载文件,以及处理异常情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class SftpHelper {

    private String ip;

    private String port;

    private String user;

    private String pwd;

    private ChannelSftp channelSftp;

    public SftpHelper(String ip, String port, String user, String pwd) {
        this.ip = ip;
        this.port = port;
        this.user = user;
        this.pwd = pwd;
    }

    /**
     * 下载sftp
     * @param directory 下载完整路径
     * @return
     */
    public String sftpDownloadBase64(String directory){
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        Sftp sftp = new Sftp(this.ip,Integer.parseInt(this.port),this.user,this.pwd);
        this.channelSftp = sftp.getClient();
        sftp.download(directory,os);
        String base64 = cn.hutool.core.codec.Base64.encode(os.toByteArray());
        return base64;
    }

    /**
     * 上传sftp
     * @param fileName 文件名
     * @param dir 文件目录
     * @param base64
     */
    public void sftpUploadFile(String fileName,String dir,String base64){
        ChannelSftp sftp = this.channelSftp;
        Session session = null;
        String ret = "";
        try {
            session = JschUtil.getSession(ip,Integer.parseInt(port),user,pwd);
            Properties properties = new Properties();
            properties.put("StrictHostKeyChecking", "no");
            session.setConfig(properties);
            if (!session.isConnected()){
                session.connect();
            }
            if (sftp == null){
                sftp = (ChannelSftp) session.openChannel("sftp");
                sftp.connect();
            }

            // 如果不存在目标文件夹
            if (!exist(sftp, dir)) {
                mkdirs(sftp, dir);
            }

            sftp.put(base64ToInputStream(base64),fileName);
        }catch (Exception e){
            e.printStackTrace();
            throw new ControllerException("sftp文件上传异常!");
        }finally {
            sftp.disconnect();
            session.disconnect();
        }
    }



    public static void main(String[] args) {
        SftpHelper helper =new SftpHelper("192.168.16.1","22","user","111111");
        //String ret = helper.sftpDownloadBase64("/test/gn.png");
        String ret = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjc4OEZDNDg0NEQ0QTExRThCNTU1OEUzNDVDMkIwMzY2IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjc4OEZDNDg1NEQ0QTExRThCNTU1OEUzNDVDMkIwMzY2Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6Nzg4RkM0ODI0RDRBMTFFOEI1NTU4RTM0NUMyQjAzNjYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6Nzg4RkM0ODM0RDRBMTFFOEI1NTU4RTM0NUMyQjAzNjYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5aeLi5AAADo0lEQVR42hyTyW8bZQDF33zzzeIZ2+N4TeI4jYlDIhKaOi2loRyqmFJKxSqBxCKV9kbPSJwKSAik/gkcSgUHKKhIlCIoEgholIgGUoizQBanTlMncex4yXgbe2Y+rL7700/vJz1u+u8JEEbhr8RgGHXcX15TC3mrv2QEn6rY/a9aps1YbfErYmV/ZjDWKyZfMxmgERMEAMWDMJjYh2VV+3aKgx/czXWfcaq6fyiiwOWTcDc7fiy77cibldkbvHnnfcKRTe5BHeAvvBODbVu8Yaz0LswHL/4y8+a5AeeMcqbyLUbWJxFZn0aArcKMDCo71ltxqZFUPSSVNJlSIYRj/PEBD1TVji6sTFy5fuP8i2Peq9zZxmWEbjPUbAlWhod/VofmnsSetxcZ62zcbhYPSSz9e1W3S2Tq0x1uezqfuPHTayf+WwyRhPodfFMyGroIVmGw2/PsMkXwVxux5tcosSGSqZ+fEM1mopRvEBIb4o4c7Nm7aOVzjKd7CDhMYJNC1O22KQGcTEF1C2KOQrF15HerMI2KdXRMf6+nkztGO4PGaHi4GjngW8TswivISgGEn9zCfsiF8usaiM7A3CU4SRk52oPUiopTI0t871g9EkxLcdLZaT53P9XEw6E/UKt68UXyJWw+w8PqlCBN2uDnLLSGRWwkFFxbagN2negPJLGzYSLcZZ8mbk3s0fwCxmK3EfDfw48330DjMoHyZwasqKO106b/lkbxig83rz+LkD+DgyN34PFRuNx8mKys0i+J6sAj41mcPHoVBTOE5PoElvejWFsLILfVgZQexdR8AoVmF54+/Q0GDm+AOkUsr9Br1O81xyoZBqtt++Xxz7Cw+Dg+rHyM2r8EJ2K30OvdxA/Zk0i5BxEf/QcvPPEJtpZaoEyEv8M4RMtZbQaH7YkmJ4ZCkQIuXTiH7f04lvXjSBy5BZXsIryagUeoIdqThNLaQlPWIPE0l8sKM9xHz/fBHaydGoqzS9Rlj1KjDHnPRP8w0KIy6iUTPrfV/gnDvTpFwfAADSytzanv5vPC91R2FyWR8AfCPqY2ZIJcVoMhNvHXnImmDrg1GVknhd4Cmg4eoS7A0WzJG6Ld1xHgHNSjODhFYfVy2UorMrqdGlMaDrFN4eHTahAoQ1GgYJRAkwCBoFEu0rQm21WRtMB9/nZ3Wx+jjIPH5UdUkIXHvB7+0Vq19pBllKK2zQgve9JOl7pW2GPzjZox2yghJQh8kSO8+b8AAwDYPqUwVKetEAAAAABJRU5ErkJggg==";
        System.out.println(ret);

        helper.sftpUploadFile("1.png","/2023/02/",ret);


    }



    public String downloadFileToBase64(String filePath){
        ChannelSftp sftp = null;
        Session session = null;
        String ret = "";
        try {
            session = JschUtil.getSession(ip,Integer.parseInt(port),user,pwd);
            Properties properties = new Properties();
            properties.put("StrictHostKeyChecking", "no");
            session.setConfig(properties);
            session.connect();
            sftp = (ChannelSftp) session.openChannel("sftp");
            sftp.connect();
            InputStream io = sftp.get(filePath);
            ret = inputStream2Base64(io);
            io.close();
        }catch (Exception e){
            e.printStackTrace();
            throw new ControllerException("sftp文件下载异常!");
        }finally {
            sftp.disconnect();
            session.disconnect();
        }
        return ret;

    }

    public void uploadFile(String filePath,String base64){
        ChannelSftp sftp = null;
        Session session = null;
        String ret = "";
        try {
            session = JschUtil.getSession(ip,Integer.parseInt(port),user,pwd);
            Properties properties = new Properties();
            properties.put("StrictHostKeyChecking", "no");
            session.setConfig(properties);
            session.connect();
            sftp = (ChannelSftp) session.openChannel("sftp");
            sftp.connect();
            sftp.put(base64,filePath);
        }catch (Exception e){
            e.printStackTrace();
            throw new ControllerException("sftp文件下载异常!");
        }finally {
            sftp.disconnect();
            session.disconnect();
        }
    }

    /**
     * 判断文件夹是否存在
     *
     * @param channelSftp
     * @param dir
     * @return
     */
    protected boolean exist(ChannelSftp channelSftp, String dir) {
        try {
            channelSftp.lstat(dir);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 创建文件夹
     *
     * @param channelSftp
     * @param dir
     * @return
     */
    protected boolean mkdirs(ChannelSftp channelSftp, String dir) {
        try {
            String pwd = channelSftp.pwd();
            if (StringUtils.contains(pwd, dir)) {
                return true;
            }
            String relativePath = StringUtils.substringAfter(dir, pwd);
            String[] dirs = StringUtils.splitByWholeSeparatorPreserveAllTokens(relativePath, "/");
            for (String path : dirs) {
                if (StringUtils.isBlank(path)) {
                    continue;
                }
                try {
                    channelSftp.cd(path);
                } catch (SftpException e) {
                    channelSftp.mkdir(path);
                    channelSftp.cd(path);
                }
            }
            return true;
        } catch (Exception e) {
            return false;
        }
    }
    private static String inputStream2Base64(InputStream is) throws Exception {
        byte[] data = null;
        try {
            ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
            byte[] buff = new byte[100];
            int rc = 0;
            while ((rc = is.read(buff, 0, 100)) > 0) {
                swapStream.write(buff, 0, rc);
            }
            data = swapStream.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    throw new Exception("输入流关闭异常");
                }
            }
        }

        return Base64.getEncoder().encodeToString(data);
    }

    private static InputStream base64ToInputStream(String base64string) {
        ByteArrayInputStream stream = null;
        try {
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] bt = decoder.decodeBuffer(base64string);
            stream = new ByteArrayInputStream(bt);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return stream;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值