You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring Boot+Kubernetes的Java项目中校验指定FTP服务器路径的文件是否存在

FTP文件存在性及完整性校验实现方案

核心实现路径(两种可选)

方案1:Spring Boot 原生集成(无需额外shell脚本)

你当前使用的是Spring Boot项目,可直接集成FTP客户端依赖完成校验,无需额外维护脚本,校验逻辑可直接和业务流程打通,K8s集群也不需要提前配置FTP相关参数,仅需将FTP连接信息通过Secret/ConfigMap注入到Pod环境变量即可。
推荐使用Apache Commons Net组件实现,核心校验逻辑示例如下:

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import java.io.IOException;

public class FtpValidator {
    // 以下参数从配置文件/环境变量读取
    private String ftpHost;
    private Integer ftpPort;
    private String ftpUsername;
    private String ftpPassword;

    /**
     * 校验FTP文件是否存在且传输完成
     * @param ftpFilePath FTP上文件的完整路径
     * @param expectedFileSize 源PV中文件的大小,用于校验传输完整性
     * @return 校验结果
     */
    public boolean validateFtpFile(String ftpFilePath, long expectedFileSize) {
        FTPClient ftpClient = new FTPClient();
        try {
            ftpClient.connect(ftpHost, ftpPort);
            boolean loginSuccess = ftpClient.login(ftpUsername, ftpPassword);
            if (!loginSuccess) {
                return false;
            }
            ftpClient.enterLocalPassiveMode();
            FTPFile[] targetFiles = ftpClient.listFiles(ftpFilePath);
            // 文件存在且大小和源文件一致,判定为传输完成
            return targetFiles.length == 1 && targetFiles[0].getSize() == expectedFileSize;
        } catch (IOException e) {
            // 可根据业务需要添加异常上报逻辑
            return false;
        } finally {
            try {
                if (ftpClient.isConnected()) {
                    ftpClient.logout();
                    ftpClient.disconnect();
                }
            } catch (IOException ignore) {}
        }
    }
}

方案2:shell脚本实现(适合独立巡检场景)

如果校验逻辑不需要和Spring Boot业务流程联动,仅需要定时巡检、触发告警,可编写独立shell脚本实现,配合K8s CronJob可实现自动定时校验。脚本可通过ConfigMap挂载到Pod中,无需打包进业务镜像。
基于lftp的校验脚本示例如下:

#!/bin/bash
# 配置参数从环境变量/Secret挂载的配置文件读取
FTP_HOST=${FTP_HOST}
FTP_PORT=${FTP_PORT:-21}
FTP_USER=${FTP_USER}
FTP_PASS=${FTP_PASS}
TARGET_FTP_PATH=${TARGET_FTP_PATH}
EXPECTED_FILE_SIZE=${EXPECTED_FILE_SIZE}

# 执行校验
ftp_file_size=$(lftp -u "${FTP_USER},${FTP_PASS}" -p "${FTP_PORT}" "${FTP_HOST}" -e "set net:timeout 10; size ${TARGET_FTP_PATH}; quit" 2>/dev/null)

if [[ $? -eq 0 && "${ftp_file_size}" -eq "${EXPECTED_FILE_SIZE}" ]]; then
    echo "校验通过:文件存在且大小匹配"
    exit 0
else
    echo "校验失败:文件不存在或未传输完成"
    exit 1
fi

选型建议

  • 校验结果需要支撑后续业务流程的,优先选方案1,逻辑内聚,无需额外维护任务调度
  • 仅需独立监控校验、和业务流程无关的,优先选方案2,更轻量,和业务代码解耦

注意事项

FTP账号密码等敏感信息必须通过K8s Secret存储,禁止硬编码在代码、脚本或普通ConfigMap中
不要仅校验文件是否存在,需同步比对文件大小或MD5哈希值,避免NiFi还在传输过程中就被判定为已生成

内容的提问来源于stack exchange,提问作者codeDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:12:00