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
相关产品推荐
相关产品推荐

