连接sftp服务,下载文件到本地

入职第一周,分配到一个需求,需要到sftp服务器上下载投诉信息的csv文件,然后解析csv文件,把投诉信息保存到clickhouse数据库。记录一下连接sftp服务的过程。

sftp简介

FTP(File Transfer Protocol):文件传输协议,是用于在网络上进行文件传输的一套标准协议。

与ftp协议不同,SFTP(SSH File Transfer Protocol):SSH文件传输协议(安全文件传送协议),是一种加密的文件传输协议。连接sftp服务需要提供用户名和密码。

可以使用FileZilla来连接远程服务,查看文件

打开软件->文件->新站点,然后依次填写主机IP地址,端口为22,用户名,密码即可登录成功。

 

 代码示例

接下来编写代码实现文件下载,流程如下

  1. 获取ChannelSftp连接
  2. 将指定文件下载到本地

添加依赖

<!--sftp核心依赖包-->
<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.54</version>
</dependency>
private static final String IP = "";
private static final Integer PORT = 22;
private static final String USERNAME = "";
private static final String PASSWORD = "";
private static final String REMOTEFILE_PATH = "/home/app/mastercom/tousu/";
private static final String LOCALFILE_PATH = "F:\\testDir\\";

先指定远程的文件目录,本地的文件目录

        JSch jsch = new JSch();
        try {
            Session session = jsch.getSession(USERNAME, IP, PORT);
            session.setPassword(PASSWORD);
            session.setConfig("StrictHostKeyChecking", "no");
            session.connect();
            ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
            channelSftp.connect();
            //这里面可以写操作文件的逻辑

            channelSftp.disconnect();
            session.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
            logger.info("从sftp服务下载文件出现异常,e:{}",e);
        }
        logger.info("从sftp服务下载文件完成,下载的文件路径,fileNameList:{}", fileNameList);
        

在我的业务中要选取特定的文件,将文件名符合条件的文件下载。 

先根据指定的的时间格式获取当前时间的字符串表达式,比如”20230728_1630“

            //获取当前时间的向下取整半小时的匹配时间
            Date currentTime = new Date();
            String roundedTime = roundDownToHalfHour(currentTime);
            
            private String roundDownToHalfHour(Date currentTime) {
                long timeMillis = currentTime.getTime();
                // 向下取整到半小时的时间戳
                long timeRounded = timeMillis - (timeMillis % (30 * 60 * 1000)); 
                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmm");
                return sdf.format(new Date(timeRounded));
            }

         

 获取远程目录下的所有文件,过滤掉需要下载的文件,注意文件夹也要排除掉

            // 获取远程文件夹下的所有文件
            Vector<ChannelSftp.LsEntry> fileList = channelSftp.ls(REMOTEFILE_PATH);
            for (ChannelSftp.LsEntry entry : fileList) {
                if (!entry.getAttrs().isDir()) {
                    String filename = entry.getFilename();
                    // 如果文件名匹配上,则下载到本地
                    if (filename.contains(roundedTime)) {
                        String remoteFileName = REMOTEFILE_PATH + filename;
                        // 指定本地文件保存路径
                        String localFileName = LOCALFILE_PATH + filename;
                        File localFile = new File(localFileName);
                        FileOutputStream output = new FileOutputStream(localFile);
                        channelSftp.get(remoteFileName, output);

                        fileNameList.add(localFileName);
                    }
                }
            }

将文件的路径和文件名保存到list返回,方便之后同步文件到数据库

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值