作为我工作的一部分,我需要为使用FTP, FTPS Explicit
和FTPS Implicit
的FTP开发连接系统,然后列出服务器中的文件夹树。
我对FTP and FTPS Implicit
没有任何问题,但我无法在FTPS Explicit
案例中列出目录。 ftp_nlist
函数在所有情况下都返回false,即使在登录后使用ftp_pasv
。
我使用Curl作为经典FTP的隐式和ftp_connect。对于显式,我使用ftp_ssl_connect
和ftp_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?) 提前谢谢你
答案 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;
}
}