如何使用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
相关产品推荐
相关产品推荐

