我有以下类用于在目录中上传文件,但是,应该创建的第一个目录是设置为“文件”而不是“文件夹”。因此,应上传的项目无法正确上传。我不确定我是否错过了一个步骤,或者我是否错误地设置了它。
include 'Net/SFTP.php';
class SFTPConnection
{
private $sftp;
public function __construct($host, $username, $password)
{
$this->sftp = new Net_SFTP($host);
if (!$this->sftp)
error_log("Could not connect to $host.");
if (!$this->sftp->login($username, $password))
error_log("Could not authenticate with username $username " .
"and password $password.");
}
public function uploadFiles($dir, $to, $from) {
$result = array();
$toDir = str_replace($from, $to, $dir);
$cdir = scandir($dir);
foreach ($cdir as $key => $value) {
if (!in_array($value, array(".", ".."))) {
if (is_dir($dir . DIRECTORY_SEPARATOR . $value)) {
if(!$this->sftp->mkdir($toDir . DIRECTORY_SEPARATOR .$value)) {
echo "Could not create directory <br>'";
exit();
}
$result[$value] = $this->uploadFiles($dir . DIRECTORY_SEPARATOR . $value, $to, $from);
} else {
$result[] = $value;
echo "Uploading $dir/$value <br>";
if(!$this->sftp->put($toDir . DIRECTORY_SEPARATOR . $value, $dir . DIRECTORY_SEPARATOR . $value, NET_SFTP_LOCAL_FILE)) {
echo "Could not upload file <br>";
exit();
}
}
}
}
return $result;
}
}
答案 0 :(得分:0)
它对我有用。我尝试了$sftp->mkdir('Test folder')
和$sftp->mkdir('./Test folder/Another folder')
。创建的目录是按预期创建的。
要记住的一件事...... DIRECTORY_SEPARATOR
可能不是在这个例子中使用的最好的东西。例如,在Windows上,DIRECTORY_SEPARATOR
是\ - 不是/。这是一个问题,因为SFTP规范说目录用/ - 表示。引用draft-ietf-secsh-filexfer-02:
此协议将文件名表示为字符串。假设文件名使用斜杠(&#39; /&#39;)字符作为目录分隔符。
我想进一步了解SFTP日志的副本会有所帮助。也许只提供mkdir
操作的SFTP日志。您可以通过在顶部执行define('NET_SFTP_LOGGING', 2)
然后在echo $sftp->getSFTPLog()
之后执行mkdir
来获取SFTP日志。