SFTP 工具类



import com.ai.frame.config.FtpConfig;
import com.ai.frame.config.SftpConfig;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpATTRS;
import com.jcraft.jsch.SftpException;
import org.apache.commons.lang3.StringUtils;
import org.omg.CORBA.SystemException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class SFTPUtils {

    private ChannelSftp sftp;
    private Session session;
    private String sftpPath;
    private Logger log = LoggerFactory.getLogger(SFTPUtils.class);

    public SFTPUtils(FtpConfig ftpConfig) {
        this.connectServer(ftpConfig.getFTP_ADDRESS(), Integer.parseInt(ftpConfig.getFTP_PORT()), ftpConfig.getFTP_USERNAME(), ftpConfig.getFTP_PASSWORD(), ftpConfig.getFTP_BASEPATH());
    }
    public SFTPUtils(SftpConfig sftpConfig) {
        this.connectServer(sftpConfig.getFtpHost(), Integer.parseInt(sftpConfig.getFtpPort()), sftpConfig.getFtpUserName(), sftpConfig.getFtpPassword(), sftpConfig.getSftpPath());
    }
    public SFTPUtils(String ftpHost, int ftpPort, String ftpUserName, String ftpPassword, String sftpPath) {
        this.connectServer(ftpHost, ftpPort, ftpUserName, ftpPassword, sftpPath);
    }

    /**
     * 创建连接
     * @param ftpHost
     * @param ftpPort
     * @param ftpUserName
     * @param ftpPassword
     * @param sftpPath
     */
    private void connectServer(String ftpHost, int ftpPort, String ftpUserName, String ftpPassword, String sftpPath) {
        try {
            this.sftpPath = sftpPath;
            // 创建JSch对象
            JSch jsch = new JSch();
            // 根据用户名,主机ip,端口获取一个Session对象
            session = jsch.getSession(ftpUserName, ftpHost, ftpPort);
            if (StringUtils.isNotBlank(ftpPassword)) {
                // 设置密码
                session.setPassword(ftpPassword);
            }
            Properties configTemp = new Properties();
            configTemp.put("StrictHostKeyChecking", "no");
            // 为Session对象设置properties
            session.setConfig(configTemp);
            // 设置timeout时间
            session.setTimeout(60000);
            // 通过Session建立链接
            session.connect();
            // 打开SFTP通道
            sftp = (ChannelSftp) session.openChannel("sftp");
            // 建立SFTP通道的连接
            sftp.connect();
        } catch (JSchException e) {
            e.printStackTrace();
        }
    }

    /**
     * 断开SFTP Channel、Session连接
     */
    public void closeChannel() {
        try {
            if (sftp != null) {
                sftp.disconnect();
            }
            if (session != null) {
                session.disconnect();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 本地上传文件
     *
     * @param localFile  本地文件
     * @param remotePath 远程文件
     * @param fileName   文件名称
     */
    public void upload(String localFile, String remotePath, String fileName) {
        try {
                remotePath = sftpPath + remotePath;
                createDir(remotePath);
                sftp.put(localFile, (remotePath + fileName), ChannelSftp.OVERWRITE);
        } catch (SftpException e) {
            e.printStackTrace();
        }
    }

    /**
     * 文件流上传文件
     *
     * @param file       文件流
     * @param remotePath 远程目录
     * @param fileName   文件名称
     */
    public void upload(MultipartFile file, String remotePath, String fileName) {
        InputStream is = null;
        try {
            remotePath = sftpPath + remotePath;
            createDir(remotePath);
            is = file.getInputStream();
            sftp.put(is, fileName);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    log.error(e.toString());
                }
            }
        }
    }

    /**
     * 下载文件
     *
     * @param remotePath 远程文件
     * @param fileName   文件名称
     * @param localFile  本地文件
     */
    public void download(String remotePath, String fileName, String localFile) {
        try {
            remotePath = sftpPath + remotePath;
            if (StringUtils.isNotBlank(remotePath)) {
                sftp.cd(remotePath);
            }
            sftp.get((remotePath + fileName), localFile);
        } catch (SftpException e) {
            e.printStackTrace();
        }
    }
    /**
     * 下载文件
     *
     * @param remotePath 远程路径
  
     */
    public InputStream download(String remotePath, String fileName) {
        try {
            remotePath = sftpPath + remotePath;
            if (StringUtils.isNotBlank(remotePath)) {
                sftp.cd(remotePath);
            }
            return  sftp.get(fileName);
        } catch (SftpException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 删除文件
     *
     * @param remotePath 要删除文件所在目录
     */
    public void delete(String remotePath) {
        try {
            if (StringUtils.isNotBlank(remotePath)) {
                remotePath = sftpPath + remotePath;
                sftp.rm(remotePath);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 创建一个文件目录
     */
    public void createDir(String createpath) {
        try {
            if (isDirExist(createpath)) {
                this.sftp.cd(createpath);
                return;
            }
            String pathArry[] = createpath.split("/");
            StringBuffer filePath = new StringBuffer("/");
            for (String path : pathArry) {
                if (path.equals("")) {
                    continue;
                }
                filePath.append(path + "/");
                if (isDirExist(filePath.toString())) {
                    sftp.cd(filePath.toString());
                } else {
                    // 建立目录
                    sftp.mkdir(filePath.toString());
                    // 进入并设置为当前目录
                    sftp.cd(filePath.toString());
                }
            }
            this.sftp.cd(createpath);
        } catch (SftpException e) {
            e.printStackTrace();
        }
    }

    /**
     * 判断目录是否存在
     */
    public boolean isDirExist(String directory) {
        boolean isDirExistFlag = false;
        try {
            SftpATTRS sftpATTRS = sftp.lstat(directory);
            isDirExistFlag = true;
            return sftpATTRS.isDir();
        } catch (Exception e) {
            if (e.getMessage().toLowerCase().equals("no such file")) {
                isDirExistFlag = false;
            }
        }
        return isDirExistFlag;
    }

}