如何扫描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创建系统临时文件,处理完成后立即删除,避免残留文件占用磁盘空间。
运行建议
- 将代码保存为
auto_add_css.php,修改配置参数为你的FTP信息和CSS链接路径。 - 可以通过定时任务(比如Linux的Cron或Windows的任务计划)定期运行脚本,实现自动处理新增的HTML文件。
- 首次运行时会处理所有未记录的HTML文件,后续运行只处理新增文件。
内容的提问来源于stack exchange,提问作者Work
相关产品推荐
相关产品推荐

