ftp_nlist无法列出目录和文件

时间:2018-03-20 14:05:49

标签: php ssl curl

作为我工作的一部分,我需要为使用FTP, FTPS ExplicitFTPS Implicit的FTP开发连接系统,然后列出服务器中的文件夹树。

我对FTP and FTPS Implicit没有任何问题,但我无法在FTPS Explicit案例中列出目录。 ftp_nlist函数在所有情况下都返回false,即使在登录后使用ftp_pasv

我使用Curl作为经典FTP的隐式和ftp_connect。对于显式,我使用ftp_ssl_connectftp_login返回全部2个true。 ftp_nlist适用于经典的ftp连接,但不适用于显式连接。

我被迫使用PHP version 5.3而我无法升级版本。挖掘一下,我发现了一个似乎与我关注的错误陈述:ftp_nlist(): data_accept: SSL/TLS handshake failed

我的代码:

$this->ftpStream = ftp_ssl_connect ($host, $port);
$this->ftpConnection = ftp_login ($this->ftpStream, $login, $password);
ftp_pasv($this->ftpStream, true);
$filesList = ftp_nlist($this->ftpStream, $directory);

有没有人有解决方法(可能使用curl?) 提前谢谢你

1 个答案:

答案 0 :(得分:0)

具有ftp功能和PHP 5.4,我不能使用ftp_nlist。 所以我做了一个与CURL一样的函数:

/**
     * Retourne la liste des fichiers et répertoires présent dans le dossier courant
     *
     * @return array Liste des fichiers et dossiers
     */
    public function getDirectoryContent()
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, 'ftp://' . $this->login . ':' . $this->password . '@' . $this->host . $this->directory);
        curl_setopt($curl, CURLOPT_USERPWD, $this->login . ':' . $this->password);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_FTPLISTONLY, true);
        $return = curl_exec($curl);
        curl_close($curl);
        if ($return === false) {
            return false;
        } else {
            return preg_split('/[\r\n]+/', $return, -1, PREG_SPLIT_NO_EMPTY);
        }
    }

    /**
     * Retourne la liste des fichiers et répertoires présent dans le dossier courant avec les informations sur les fichiers
     *
     * @return array Liste des fichiers et dossiers
     */
    public function getDetailsDirectoryContent()
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, 'ftp://' . $this->login . ':' . $this->password . '@' . $this->host . $this->directory);
        curl_setopt($curl, CURLOPT_USERPWD, $this->login . ':' . $this->password);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'LIST');
        $return = curl_exec($curl);
        curl_close($curl);
        if ($return === false) {
            return false;
        } else {
            $fichiers = array();
            $nbFichiers = 0;
            if (preg_match_all(
                '/([-dl])([rwxst-]{9})[ ]+([0-9]+)[ ]+([^ ]+)[ ]+(.+)[ ]+([0-9]+)[ ]+([a-zA-Z]+[ ]+[0-9]+)[ ]+([0-9:]+)[ ]+(.*)/',
                $return, $m, PREG_SET_ORDER)) {
                foreach ($m as $f) {
                    $fichiers[$nbFichiers] = array();
                    $fichiers[$nbFichiers]['dir']         = $f[1] == 'd';  // Répertoire ?
                    $fichiers[$nbFichiers]['filename']    = $f[9];         // Nom
                    $fichiers[$nbFichiers]['size']        = $f[6];         // Taille
                    $fichiers[$nbFichiers]['owner']       = $f[4];         // Propriétaire
                    $fichiers[$nbFichiers]['group']       = $f[5];         // Groupe
                    $fichiers[$nbFichiers]['permissions'] = $f[2];         // Permissions
                    $fichiers[$nbFichiers]['mtime']       = "$f[7] $f[8]"; // Date de dernière modification
                    $nbFichiers++;
                }
            }
            return $fichiers;
        }
    }