热门标签 | 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
推荐阅读
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • IP双栈环境下网络应用迁移
    IPv4向IPv6迁移有多种途径,在选择具体的迁移方式时,当前环境中运行的应用是否支持IPv6是重要的考量因素之一,同时在编写新的应用时,需要考虑新编写的应用不仅可以适应当前主流的IPv4环境, ... [详细]
  • /usr/local/webots/bin/webotsbin: /lib/x86_64linuxgnu/libm.so.6: version `GLIBC_2.29‘ not found (r
    usrlocalwebotsbinwebots-bin:libx86_64-linux-gnulibm.so.6:versionGLIBC_2.29notfound(require ... [详细]
  • 三小时掌握计算机网络基础(通俗易懂)
    目录1.网络层次划分2.OSI七层网络模型3.IP地址4.子网掩码及网络划分5.ARPRARP协议6.路由选择协议7.TCPIP协议8.UDP协议 9.DNS协议 ... [详细]
  • 用lvm+vmware+kickstart实现系统自动安装和快照安装
    由于我的机子是32位,装不了64位系统,所以无法使用kvm,只能用vmware了,可是vmware安装使用自带的autoinst.iso实现自动安装,无法实现我的需求,经过研究我使用kic ... [详细]
  • PHP程序员玩转Linux系列 搭建FTP代码开发环境
    PHP程序员玩转Linux系列搭建FTP代码开发环境-PHP程序员玩转Linux系列文章:有些同学可能觉得我写的都是啥yum安装的,随便配置一下而已,没啥技术含量,我的目的是让大家 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
  • 本文介绍了在RHEL 7中的系统日志管理和网络管理。系统日志管理包括rsyslog和systemd-journal两种日志服务,分别介绍了它们的特点、配置文件和日志查询方式。网络管理主要介绍了使用nmcli命令查看和配置网络接口的方法,包括查看网卡信息、添加、修改和删除配置文件等操作。 ... [详细]
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社区 版权所有