热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java链接SFTP并进行文件操作

最近做关于对账文件的项目,就是约定第三方将对账文件放至SFTP服务器上,然后我将加密后的SFTP文件拿到、解密、然后发送邮件给需要的人。关于发送邮件在上一篇已经说过了不多赘述htt

最近做关于对账文件的项目,就是约定第三方将对账文件放至SFTP服务器上,然后我将加密后的SFTP文件拿到、解密、然后发送邮件给需要的人。

关于发送邮件在上一篇已经说过了不多赘述https://www.cnblogs.com/yangchengdebokeyuan/p/14812179.html

关于SFTP操作我自己总结的其实就是长时间对一个文件服务器进行操作,其中大致分为三个步骤 登录服务器(建立连接)、操作文件及逻辑处理、登出(关闭连接)

其实我除了操作文件的逻辑以及服务器不同之外用的全是同事之前写的SFTP工具类,所以此篇逻辑部分只能作为参考并不能直接引用。

一、建立链接&断开链接

  其实就是调用util类的方法就行了,因为项(zi)目(ji)急(lan)就没做过多了解,有兴趣的小伙伴可以了解下_(:з」∠)_

  

import com.jcraft.jsch.*;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;

import java.io.*;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class SftpUtils {

    @Value("${FTP-HOST}")
    private String sftpHost;


    @Value("${FTP-PORT}")
    private Integer sftpPort;


    @Value("${FTP-USERNAME}")
    private String username;


    @Value("${FTP-PASSWORD}")
    private String password;

    private ChannelSftp sftp;
    private Session session;

    private static Logger logger = LoggerFactory.getLogger(SftpUtils.class);

    protected final static int CLIENT_TIMEOUT = 1000 * 180;

    public SftpUtils(String username, String password, String sftpHost, int sftpPort) {
        this.username = username;
        this.password = password;
        this.sftpHost = sftpHost;
        this.sftpPort = sftpPort;
    }

    public SftpUtils() {
    }

    public void login() {
        try {
            JSch jsch = new JSch();

            session = jsch.getSession(username, sftpHost, sftpPort);
            session.setTimeout(CLIENT_TIMEOUT);
            if (password != null) {
                session.setPassword(password);
            }
            Properties config = new Properties();
            config.put("StrictHostKeyChecking", "no");

            session.setConfig(config);
            session.connect();

            Channel channel = session.openChannel("sftp");
            channel.connect();

            sftp = (ChannelSftp) channel;
            if (sftp != null) {
                logger.debug("SftpUtils-sftpHost:{},sftpPort:{},username:{},password:{},success", sftpHost, sftpPort, username, password);
            } else {
                logger.debug("SftpUtils-sftpHost:{},sftpPort:{},username:{},password:{},faild", sftpHost, sftpPort, username, password);
            }
        } catch (Exception e) {
            logout();
            e.printStackTrace();
            logger.debug("login" + e);
        }
    }

    /**
     * 关闭连接 server
     */
    public void logout() {
        if (sftp != null) {
            if (sftp.isConnected()) {
                sftp.disconnect();
            }
        }
        if (session != null) {
            if (session.isConnected()) {
                session.disconnect();
            }
        }
    }

    /**
     * 将输入流的数据上传到sftp作为文件。文件完整路径=basePath+directory
     *
     * @param directory    上传到该目录
     * @param sftpFileName sftp端文件名
     */
    public boolean upload(String directory, String sftpFileName, InputStream input) {
        try {
            if (directory != null && !"".equals(directory)) {
                sftp.cd(directory);
            }
            sftp.put(input, sftpFileName);  //上传文件
            return true;
        } catch (SftpException e) {
            e.printStackTrace();
            return false;
        }
    }

    public InputStream readFile(String ftpPath) {
        InputStream inputStream = null;
        try {
            inputStream = sftp.get(ftpPath);
        } catch (Exception e) {
            e.printStackTrace();
            logger.info("readFile error.");
        }
        return inputStream;
    }

    public static int compress(List filePaths, String zipFilePath, Boolean keepDirStructure) throws IOException {
        byte[] buf = new byte[1024];
        File zipFile = new File(zipFilePath);
        //zip文件不存在,则创建文件,用于压缩
        if (!zipFile.exists())
            zipFile.createNewFile();
        int fileCount = 0;//记录压缩了几个文件?
        try {
            ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile));
            for (int i = 0; i ) {
                String relativePath = filePaths.get(i);
                if (StringUtils.isEmpty(relativePath)) {
                    continue;
                }
                File sourceFile = new File(relativePath);//绝对路径找到file
                if (sourceFile == null || !sourceFile.exists()) {
                    continue;
                }
                FileInputStream fis = new FileInputStream(sourceFile);
                if (keepDirStructure != null && keepDirStructure) {
                    //保持目录结构
                    zos.putNextEntry(new ZipEntry(relativePath));
                } else {
                    //直接放到压缩包的根目录
                    zos.putNextEntry(new ZipEntry(sourceFile.getName()));
                }
                //System.out.println("压缩当前文件:"+sourceFile.getName());
                int len;
                while ((len = fis.read(buf)) > 0) {
                    zos.write(buf, 0, len);
                }
                zos.closeEntry();
                fis.close();
                fileCount++;
            }

            zos.close();
            logger.debug("压缩完成");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return fileCount;
    }

    /**
     * 更换文件名
     * [oldFileName, newfileName]
     *
     * @return boolean
     * 
     * @date 2020/10/20 16:10
     */
    public boolean renameFile(String oldFileName, String newfileName) {
        boolean flag = false;
        if (sftp != null) {
            try {
                sftp.rename(oldFileName, newfileName);
                flag = true;
            } catch (Exception e) {
                logger.error("更换文件名--ERROR:" + e);
                flag = false;
            }
        }
        return flag;
    }

    /**
     * 读取ftp目录下全部文件夹
     * [directory]
     *
     * @return java.util.Vector
     * 
     * @date 2020/10/21 9:28
     */
    public Vector listFiles(String directory) throws SftpException {
        return sftp.ls(directory);
    }

    /**
     * 文件夹是否存在
     * [directory]
     *
     * @return boolean
     * 
     * @date 2020/10/21 16:47
     */
    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;
            }
            logger.debug("isDirExist:" + e);
        }
        return isDirExistFlag;
    }

    /**
     * 删除文件
     * [oldFileName, newfileName]
     *
     * @return boolean
     *
     * @date 2020/10/22 9:54
     */
    public boolean delete(String directory, String deleteFile) throws Exception {
        boolean flag = false;
        if (sftp != null) {
            try {
                sftp.cd(directory);
                sftp.rm(deleteFile);
                flag = true;
            } catch (Exception e) {
                logger.error("删除文件夹--ERROR:" + e);
                flag = false;
            }
        }
        return flag;
    }

    /**
     * 创建该文件夹
     * [createpath]
     *
     * @return void
     *
     * @date 2020/10/21 16:53
     */
    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) {
            logger.error("创建路径错误:" + createpath);
        }
    }


    public static void main(String[] args) {
//        SftpUtils sftp1 = new SftpUtils("sftptest", "xxxxx", "172.30.xx.xxx", 443);
//        sftp1.login();
//        ChannelSftp sftp = new ChannelSftp();
//        if (sftp != null) {
//            try {
//                sftp.rename("/home/sftptest/TEST/xxx094300.csv", "/home/sftptest/TEST/xxxx094300.csv");
//            } catch (Exception e) {
//                logger.error("更换文件名--ERROR:" + e);
//            }
//        }

    }

}
View Code
推荐阅读
author-avatar
mobiledu2502872407
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有