0

我有以下用于在目录中上传文件的类,但是,应该创建的第一个目录被设置为“文件”而不是“文件夹”。因此,应该上传的项目没有正确上传。我不确定我是否遗漏了一个步骤,或者我是否设置不正确。

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;
    }
}
4

1 回答 1

0

这个对我有用。我试过$sftp->mkdir('Test folder')$sftp->mkdir('./Test folder/Another folder')。创建的目录按预期创建。

要记住的一件事...... DIRECTORY_SEPARATOR在这种情况下可能不是最好的使用方法。例如,在 Windows 上,DIRECTORY_SEPARATOR是 \ - 而不是 /。这是一个问题,因为 SFTP 规范说目录将用 / - not 表示。引用draft-ietf-secsh-filexfer-02

该协议将文件名表示为字符串。假定文件名使用斜杠 ('/') 字符作为目录分隔符。

我想进一步了解 SFTP 日志的副本会有所帮助。也许只是提供一个mkdir操作的 SFTP 日志。您可以通过define('NET_SFTP_LOGGING', 2)在顶部执行然后echo $sftp->getSFTPLog()mkdir.

于 2016-07-15T15:38:02.310 回答