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

如何扫描FTP中Excel生成的HTML文件,批量添加CSS链接至<head>标签?

我来帮你搞定这个问题!针对FTP文件夹里的Excel生成的HTML文件自动插入CSS链接的需求,我整理了一套可行的PHP方案——你之前用scandir/glob没成功,大概率是因为直接用了本地文件系统的函数,而FTP目录需要用专门的FTP操作函数来处理。

解决方案思路

要实现自动扫描FTP上的HTML文件并插入CSS链接,核心步骤是:

  • 连接FTP服务器并递归获取所有HTML文件列表(包括子目录)
  • 检查每个HTML文件的<head>标签内是否已存在目标CSS链接
  • 对未添加链接的文件插入代码并回传到FTP
  • 记录已处理文件,后续运行时只处理新增文件
完整PHP代码实现
<?php
// 配置参数
$ftpServer = 'your-ftp-server.com';       // FTP服务器地址
$ftpUser = 'your-ftp-username';           // FTP用户名
$ftpPass = 'your-ftp-password';           // FTP密码
$targetDir = '/path/to/your/html/folder'; // FTP上存放HTML的目录
$cssLink = '<link rel="stylesheet" href="/path/to/your/style.css">'; // 要插入的CSS链接
$processedLog = 'processed_html_files.log'; // 本地记录已处理文件的日志

// 连接FTP服务器
$conn = ftp_connect($ftpServer) or die("无法连接到FTP服务器,请检查地址是否正确");
ftp_login($conn, $ftpUser, $ftpPass) or die("FTP登录失败,请检查用户名/密码");
ftp_pasv($conn, true); // 启用被动模式,大部分FTP服务器需要这个

// 读取已处理的文件列表
$processedFiles = [];
if (file_exists($processedLog)) {
    $processedFiles = file($processedLog, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
}

/**
 * 递归扫描FTP目录下的所有HTML文件
 * @param resource $conn FTP连接资源
 * @param string $dir 当前扫描的目录
 * @return array 所有HTML文件的路径
 */
function scanFtpHtmlFiles($conn, $dir) {
    $htmlFiles = [];
    $items = ftp_nlist($conn, $dir);
    
    foreach ($items as $item) {
        $basename = basename($item);
        // 跳过.和..目录
        if ($basename === '.' || $basename === '..') continue;
        
        // 判断是文件还是目录:ftp_size返回-1表示是目录
        $fileSize = ftp_size($conn, $item);
        if ($fileSize === -1) {
            // 递归扫描子目录
            $htmlFiles = array_merge($htmlFiles, scanFtpHtmlFiles($conn, $item));
        } else {
            // 筛选.html/htm后缀的文件(忽略大小写)
            $ext = strtolower(pathinfo($item, PATHINFO_EXTENSION));
            if ($ext === 'html' || $ext === 'htm') {
                $htmlFiles[] = $item;
            }
        }
    }
    return $htmlFiles;
}

// 获取所有HTML文件
$allHtmlFiles = scanFtpHtmlFiles($conn, $targetDir);

// 处理每个HTML文件
foreach ($allHtmlFiles as $filePath) {
    // 跳过已处理的文件
    if (in_array($filePath, $processedFiles)) {
        echo "已处理过:{$filePath}\n";
        continue;
    }

    // 创建临时文件用于处理
    $tempFile = tempnam(sys_get_temp_dir(), 'ftp_html_');
    if (!$tempFile) {
        echo "无法创建临时文件,跳过:{$filePath}\n";
        continue;
    }

    // 从FTP下载文件到临时文件
    if (ftp_get($conn, $tempFile, $filePath, FTP_BINARY)) {
        $content = file_get_contents($tempFile);
        
        // 检查是否存在<head>标签
        if (preg_match('/<head[^>]*>/i', $content, $headMatches)) {
            $headTag = $headMatches[0];
            
            // 检查是否已存在目标CSS链接
            if (strpos($content, $cssLink) === false) {
                // 在<head>标签后插入CSS链接(添加缩进保证格式美观)
                $updatedContent = str_replace($headTag, "{$headTag}\n    {$cssLink}", $content);
                
                // 将修改后的内容写入临时文件
                file_put_contents($tempFile, $updatedContent);
                
                // 上传回FTP服务器
                if (ftp_put($conn, $filePath, $tempFile, FTP_BINARY)) {
                    echo "成功插入CSS链接:{$filePath}\n";
                    // 记录到已处理日志
                    file_put_contents($processedLog, "{$filePath}\n", FILE_APPEND);
                } else {
                    echo "上传修改后的文件失败:{$filePath}\n";
                }
            } else {
                echo "已存在目标CSS链接,跳过:{$filePath}\n";
                file_put_contents($processedLog, "{$filePath}\n", FILE_APPEND);
            }
        } else {
            echo "未找到<head>标签,跳过:{$filePath}\n";
        }
    } else {
        echo "下载文件失败:{$filePath}\n";
    }

    // 删除临时文件
    unlink($tempFile);
}

// 关闭FTP连接
ftp_close($conn);
?>
关键细节说明
  • FTP被动模式:几乎所有的FTP服务器都需要启用被动模式(ftp_pasv($conn, true)),否则会因为防火墙限制无法正常传输文件。
  • 递归扫描:scanFtpHtmlFiles函数会遍历目标目录下的所有子目录,确保不会遗漏任何HTML文件。
  • 避免重复处理:通过本地日志文件记录已处理的文件路径,后续运行脚本时只会处理新增的文件,提升效率。
  • 兼容各种标签:使用正则/<head[^>]*>/i匹配带属性的<head>标签(比如<head lang="zh-CN">),并且忽略大小写,适配不同的HTML结构。
  • 临时文件安全:使用tempnam创建系统临时文件,处理完成后立即删除,避免残留文件占用磁盘空间。
运行建议
  1. 将代码保存为auto_add_css.php,修改配置参数为你的FTP信息和CSS链接路径。
  2. 可以通过定时任务(比如Linux的Cron或Windows的任务计划)定期运行脚本,实现自动处理新增的HTML文件。
  3. 首次运行时会处理所有未记录的HTML文件,后续运行只处理新增文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:21:57