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

PHP从FTP递归下载CSV文件出现foreach参数无效错误如何解决

PHP递归获取FTP服务器CSV文件报错解决方案

你遇到的Invalid argument supplied for foreach()报错核心原因是ftp_nlist执行失败返回了false而非数组,所以foreach无法遍历。你的原有代码存在几个明显问题:

  • 变量定义不符合PHP语法:basedir没有加$符号,路径拼接时把basedir写成了固定字符串而非调用变量
  • 日期格式不匹配:FTP存储路径的日期格式是Y-m-d(横杠分隔),你代码里用的是Y.m.d(点分隔),导致访问路径不存在,ftp_nlist拿不到文件列表
  • 缺少层级遍历逻辑:实际文件结构是ftpfiles/[分类目录]/[日期]/xxx.csv,你没有遍历AIN/AOUT/BIN这类一级分类目录,直接拼接的路径根本不存在
  • ftp_get参数错误:缺少本地保存路径参数,该函数要求第二个参数是本地存储路径,第三个才是远程文件路径
  • 无错误判断逻辑:没有验证ftp_login、ftp_nlist的执行结果是否正常,出错后没有对应提示

修正后可运行代码

// 初始化FTP连接,替换为你的FTP服务器地址
$con = ftp_connect('xxx.xxx.xxx.xxx');
if (!$con) {
    die("FTP连接失败");
}
// 登录验证,替换为你的FTP账号密码
$usr = 'ftp用户名';
$pwd = 'ftp密码';
$login_result = ftp_login($con, $usr, $pwd);
if (!$login_result) {
    die("FTP登录失败");
}
// 开启被动模式
ftp_pasv($con, true);

// 基础目录配置
$basedir = '/home/lanein1/ftpfiles/';
// 日期格式和实际路径保持一致,用横杠分隔
$target_date = date('Y-m-d', strtotime("-1 days"));
// 本地保存CSV的目录,提前创建并给PHP进程写入权限
$local_save_dir = './ftp_csv/';
if (!is_dir($local_save_dir)) {
    mkdir($local_save_dir, 0755, true);
}

// 第一步:获取ftpfiles下的所有一级分类目录(AIN/AOUT/BIN等)
$category_dirs = ftp_nlist($con, $basedir);
if (!$category_dirs) {
    die("无法获取一级分类目录列表");
}

foreach ($category_dirs as $category_dir) {
    // 过滤.和..这类特殊目录
    if (in_array(basename($category_dir), ['.', '..'])) {
        continue;
    }
    // 拼接当前分类下的目标日期路径
    $date_path = $category_dir . '/' . $target_date . '/';
    // 获取该日期目录下的所有文件
    $files = ftp_nlist($con, $date_path);
    if (!$files) {
        echo "路径" . $date_path . "不存在或无权限访问,跳过\n";
        continue;
    }
    // 遍历文件匹配csv格式
    foreach ($files as $remote_file) {
        if (preg_match("/\.csv$/i", $remote_file)) {
            $local_file = $local_save_dir . basename($remote_file);
            // 执行下载
            if (ftp_get($con, $local_file, $remote_file, FTP_BINARY)) {
                echo "成功下载:" . $remote_file . "\n";
            } else {
                echo "下载失败:" . $remote_file . "\n";
            }
        }
    }
}

// 关闭FTP连接
ftp_close($con);

注意事项

  • 代码中的FTP地址、账号密码、本地保存路径需要根据你的实际环境修改
  • 如果后续目录层级有调整,可以把遍历逻辑封装成递归函数,适配更深层的目录结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 10:24:02