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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:33:38