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

如何使用phpseclib3批量上传本地目录至远程服务器?

使用phpseclib3上传整个本地目录到SFTP服务器

phpseclib3的SFTP类没有直接上传整个目录的内置方法,你需要通过递归遍历本地目录,自动创建远程目录并逐个上传文件来实现。以下是完整的实现代码:

<?php
use phpseclib3\Net\SFTP;

function uploadDirectory(SFTP $sftp, string $localDir, string $remoteDir)
{
    // 统一本地目录路径格式,结尾添加系统分隔符
    $localDir = rtrim($localDir, '/\\') . DIRECTORY_SEPARATOR;
    // 统一远程目录路径格式,结尾添加斜杠
    $remoteDir = rtrim($remoteDir, '/') . '/';

    // 递归遍历本地目录(跳过.和..目录)
    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($localDir, RecursiveDirectoryIterator::SKIP_DOTS),
        RecursiveIteratorIterator::SELF_FIRST
    );

    foreach ($iterator as $item) {
        // 转换本地路径为对应的远程路径,统一用斜杠分隔
        $remotePath = $remoteDir . str_replace($localDir, '', $item->getPathname());
        $remotePath = str_replace(DIRECTORY_SEPARATOR, '/', $remotePath);

        if ($item->isDir()) {
            // 远程不存在该目录则创建(支持多级目录递归创建)
            if (!$sftp->is_dir($remotePath)) {
                $sftp->mkdir($remotePath, -1, true);
            }
        } else {
            // 上传文件到对应远程路径
            $sftp->put($remotePath, $item->getPathname(), SFTP::SOURCE_LOCAL_FILE);
        }
    }
}

// 初始化SFTP连接
$sftp = new SFTP('your-server-ip');
if (!$sftp->login('your-username', 'your-password')) {
    exit('SFTP登录失败');
}

// 调用上传函数:传入本地目录和远程目标目录路径
uploadDirectory($sftp, './local-directory', '/remote-target-directory');

关键说明:

  • 你之前尝试的put('directory/*', ...)写法无效,因为put方法仅支持单个文件或内容的上传,不识别通配符批量操作。
  • 递归遍历逻辑会自动处理所有子目录和文件,无需手动逐个操作。
  • mkdir方法的第三个参数设为true,可以一次性创建多级嵌套的远程目录,避免逐个创建父目录的麻烦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:12:13