ChannelSftp 下载时连同子级目录下的文件一起下载

 public String getFtpFile() {
        //构造登录FTP服务器配置
        SftpUtil sftp = new SftpUtil("username", "D:"+ File.separator +"WeBank"+File.separator+"id_ras", null, "你的ip", 57000);

        //获取前一天日期
        String date = DateTimeFormatter.ofPattern("yyyyMMdd").format(LocalDateTime.now().plusDays(-1));
        try {
            //登录SFTP服务器
            sftp.login();
            String key = "/send/";
            String value = "D:/WeBank/send/";
            //ftpFilePath是sftp文件路径,localFilePath是保存到本地的路径
//            String ftpFilePath = key.concat(date).concat("/").concat("EAST").concat("/");
            String ftpFilePath = key.concat(date).concat("/");
            String localFilePath = value.concat(date).concat("/");

            Vector<ChannelSftp.LsEntry> vector = sftp.listFilesRemoveDir(ftpFilePath);
            //判断是否有附件
            if (vector != null) {
                //如果有附件,下载前判断目录是否存在
                File dir = new File(value.concat(date));
                if (!dir.exists()) {
                    dir.mkdir();
                }
                //遍历附件信息,保存本地
                vector.forEach(object -> {
                    //实例附件对象信息
                    //保存入库
                    if (object.getAttrs().isDir()) { //如果下面还有目录的话,继续下载子级目录下的文件
//                        System.out.println("是否为目录"+object.getAttrs().isDir()+"是的,目录为"+object.getFilename());
                        Vector<ChannelSftp.LsEntry> v = sftp.listFilesRemoveDir(ftpFilePath.concat(object.getFilename()).concat("/"));
                        v.forEach(ESAT -> {
                            sftp.download(
                                    //sftp文件路径
                                    ftpFilePath.concat(object.getFilename()).concat("/"),
                                    //文件名称
                                    ESAT.getFilename(),
                                    //保存到本地的路径+附件名
                                    localFilePath.concat(ESAT.getFilename()));
                        });

                    } else {    //否则正常下载文件
                        sftp.download(
                                //sftp文件路径
                                ftpFilePath,
                                //文件名称
                                object.getFilename(),
                                //保存到本地的路径+附件名
                                localFilePath.concat(object.getFilename()));
                    }
                });
            }

            sftp.logout();
            return date + "期文件入库成功!";
        } catch (Exception e) {
            sftp.logout();
            e.printStackTrace();
            return date + "期文件入库失败!错误信息:" + e.getMessage();
        }
    }
   /**
     * 获取文件夹下的文件,判断删除上级目录跟根目录,避免数据的排序而错删文件
     *
     * @param directory 路径
     * @return Vector
     */
    public Vector<ChannelSftp.LsEntry> listFilesRemoveDir(String directory) {
        try {
            if (isDirExist(directory)) {
                Vector<ChannelSftp.LsEntry> vector = sftp.ls(directory);
                Vector<ChannelSftp.LsEntry> vectors = new Vector<>();
//                        //移除上级目录和根目录:"." ".."
                vector.forEach(object -> {
                    if (!(".".equals(object.getFilename())) && !("..".equals(object.getFilename()))) {
                        vectors.add(object);
                    }
                });
                return vectors;
            }
        } catch (SftpException e) {
            logger.error("获取文件夹信息异常!", e);
        }
        return null;
    }
    /**
     * 下载文件
     *
     * @param directory    SFTP服务器的文件路径
     * @param downloadFile SFTP服务器上的文件名
     * @param saveFile     保存到本地路径
     */
    public void download(String directory, String downloadFile, String saveFile) {
        try {
            if (directory != null && !"".equals(directory)) {
                sftp.cd(directory);
            }
            File file = new File(saveFile);
            sftp.get(downloadFile, new FileOutputStream(file));
        } catch (SftpException | FileNotFoundException e) {
            logger.error("文件下载异常!", e);
        }
    }

图上的sftp 为ChannelSftp 实例,可自寻搜索实例化ChannelSftp  或者直接引入ChannelSftp  实例化配置你的服务器配置即可使用图上的方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值