如何通过FTP将.part文件重命名为CSV?PHP脚本实现求助
解决FTP环境下.part文件重命名为CSV的问题
问题根源分析
你之前的代码存在几个关键问题导致在FTP环境失效:
glob()是本地文件系统函数,无法直接获取FTP服务器上的文件列表glob()返回的是数组,直接拼接.csv会导致类型错误,无法正确生成目标文件名- 混淆了本地路径与FTP服务器路径,
./指向的是脚本运行的本地目录,不是FTP上的目录 - 没有处理批量文件,也没有机制避免重复处理已完成的文件
正确实现方案
以下是可以在FTP环境下正常工作的脚本,包含批量处理、去重处理、指定目标目录的逻辑:
<?php // 配置参数 $ftpServer = "ftp.domain.com"; $ftpUser = "username"; $ftpPass = "password"; $sourceDir = "/"; // FTP上存放.part文件的目录 $targetDir = "/Plytix/"; // FTP上保存CSV文件的目标目录 $processedLog = "./processed_part_files.log"; // 本地记录已处理文件的日志 // 初始化已处理文件列表 $processedFiles = []; if (file_exists($processedLog)) { $processedFiles = file($processedLog, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); } // 连接FTP服务器 $ftpConn = ftp_connect($ftpServer); if (!$ftpConn) { die("无法连接到FTP服务器"); } // 登录FTP if (!ftp_login($ftpConn, $ftpUser, $ftpPass)) { die("FTP登录失败"); } // 切换到被动模式(大部分FTP服务器需要) ftp_pasv($ftpConn, true); // 获取FTP目录下的所有文件 $files = ftp_nlist($ftpConn, $sourceDir); if (!$files) { echo "未找到任何文件或无目录访问权限"; ftp_close($ftpConn); exit; } // 筛选出未处理的.part文件 foreach ($files as $file) { // 获取纯文件名(去掉路径) $fileName = basename($file); // 检查是否是.part文件且未处理过 if (str_ends_with($fileName, ".part") && !in_array($fileName, $processedFiles)) { // 生成目标CSV文件名(去掉.part后缀,直接用.csv) $csvFileName = substr($fileName, 0, -5) . ".csv"; $sourcePath = $sourceDir . $fileName; $targetPath = $targetDir . $csvFileName; // 执行FTP重命名 if (ftp_rename($ftpConn, $sourcePath, $targetPath)) { echo "成功重命名:$fileName -> $csvFileName\n"; // 记录到已处理日志 file_put_contents($processedLog, $fileName . PHP_EOL, FILE_APPEND); } else { echo "重命名失败:$fileName\n"; } } } // 关闭FTP连接 ftp_close($ftpConn); ?>
关键说明
- 被动模式启用:
ftp_pasv($ftpConn, true)是必须的,大部分公共FTP服务器要求使用被动模式连接 - 已处理文件记录:通过本地日志文件避免重复处理,确保每小时执行时只处理新传入的文件
- 路径处理:明确区分FTP服务器上的源目录和目标目录,使用
basename()和substr()正确处理文件名 - 批量处理:遍历所有文件,自动筛选符合条件的.part文件逐一处理
定时执行配置
要实现每小时自动执行,可使用服务器的Cron任务(Linux)或任务计划程序(Windows):
- Linux Cron示例:添加以下任务到
crontab -e
表示每小时整点执行脚本,并记录日志0 * * * * /usr/bin/php /path/to/your/script.php >> /path/to/logs/ftp_rename.log 2>&1
内容的提问来源于stack exchange,提问作者Underfunk
相关产品推荐
相关产品推荐

