2010-11-03 9 views
7

Je veux imprimer la liste des fichiers et seulement les fichiers d'un serveur FTP, voici ce que je pourrais accomplir.Obtenir la liste des fichiers par FTP

<?php 
    $ftp_server = "my ftp server"; 
    $conn_id = ftp_connect($ftp_server); 
    $ftp_user_name = "ftp username"; 
    $ftp_user_pass = "ftp password"; 
    $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); 
    $contents = ftp_nlist($conn_id, '/'); 
    for ($i = 0 ; $i < count($contents) ; $i++) 
     echo "<li>" . substr($contents[$i],1) . "</li>"; 
    ftp_close($conn_id); 
?> 

mais cela affiche le nom des fichiers et des dossiers. Comment puis-je simplement imprimer les noms des fichiers (fichiers ne peuvent pas avoir des extensions!)

Répondre

5

Options:

1) vous pouvez utiliser ftp_rawlist au lieu de ftp_nlist pour obtenir la liste complète du fichier/répertoire, qui doit indiquer que ce soit un répertoire. Cependant, le format de cette liste dépendra du système d'exploitation du serveur ftp. Par exemple, sur un système unix/linux la liste brute pourrait ressembler à ceci:

drwxrwxr-x 3 jm72 jm72 4096 Nov 2 16:39 myDir 
-rw-rw-r-- 1 jm72 jm72 257 Nov 2 16:39 myFile 

où le « d » dans la première colonne vous dira que c'est un répertoire. Je ne sais pas à quoi cela ressemblerait sur un serveur Windows. 2) pour chaque nom de fichier que vous renvoyez, essayez d'y insérer un CD. Si vous le pouvez, c'est un répertoire!

if (ftp_chdir($conn_id, substr($contents[$i],1)) { 
    //it's a directory, don't include it in your list 
    ftp_cdup($conn_id) //don't forget to go back up to the directory you started in! 
} 
+3

ne serait-il pas mieux de faire 'if (! Ftp_chdir (....) {/ * FICHIER * /} else {/ * UP * /}' – RobertPitt

+0

@JacobM: cela a fonctionné mais a donné l'erreur suivante: (Attention: ftp_chdir() [function.ftp-chdir]: /index.php: Aucun fichier ou répertoire dans C: \ wamp \ www \ Contact_Keeper \ copyftp.php) sur la ligne 14 pour chaque fichier qu'il a trouvé ... et pour la structure, il devrait être ftp_chdir ($ ftp_stream, $ directory) (obtenu à partir de dreamweaver) – sikas

+0

@RobertPitt: Oui, c'est plus lisible et correspond mieux au besoin de l'OP Je voulais juste faire mon exemple court! –

3

Voici un script qui va le faire pour vous, avec la permission d'une affiche sur ftp_nlist (PHP Docs):

<?php 

//identify directories 

function ftp_is_dir($dir) { 
    global $ftp_connect; 
    if (@ftp_chdir($ftp_connect, $dir)) { 
     ftp_chdir($ftp_connect, '..'); 
     return true; 
    } else { 
     return false; 
    } 
} 
$ftp_nlist = ftp_nlist($ftp_connect, "."); 

//alphabetical sorting 

sort($ftp_nlist); 
foreach ($ftp_nlist as $v) { 

//1. ftp_is_dir() is true => directory 
    if (ftp_is_dir($v)) { 

//output as [ directory ] 
     echo "[ " . $v . " ]<br />\n"; 
    } 
} 
foreach ($ftp_nlist as $v) { 

//2. ftp_is_dir() is false => file 
    if (!ftp_is_dir($v)) { 

//output as file 
     echo "" . $v . "<br />\n"; 
    } 
} 
?> 
+0

Cela a fonctionné pour moi mais je recommanderais de faire taire ftp_chdir avec @ftp_chdir dans la fonction si elle cracherait des avertissements en essayant d'entrer des fichiers. – Gazillion

+0

Fait, merci ... –

+0

Votre code ne fonctionne pas pour moi. la fonction renvoie toujours false. Il pense que tous sont des fichiers pas de répertoire !!! –

0

si vous utilisez le ftp_rawlist comme ceci:

$rawfiles = ftp_rawlist($conn, true); //true being for recursive 

foreach ($rawfiles as $rawfile) 
{ 
    $info = preg_split("/[\s]+/", $rawfile, 9); 
    if($info[0]{0} == 'd') 
    { 
     //Directory 
    }else 
    { 
     //File 
     $size = byteconvert($info[4]); 
     $chmod = chmodnum($info[0]); 
     $date = strtotime($info[6] . ' ' . $info[5] . ' ' . $info[7]); 
    } 
} 

Si vous obtenez plus proche de votre objectif.

+2

Cela ne fonctionnera pas si le serveur FTP est un ordinateur Windows (et n'a pas été configuré pour utiliser le formatage Unix, ce qui peut être fait). Dans ce cas, vous devrez rechercher le '

' dans la liste. –

0

Vous pouvez également utiliser la fonction ftp_mdtm(). Cela renvoie toujours une erreur (-1) en cas d'échec qui indiquerait un répertoire puisque cette fonction ne fonctionne pas pour les répertoires. Le seul inconvénient est que cela ne fonctionne pas sur certains systèmes (le manuel ne précise pas lesquels), vous devrez donc tester si cela a fonctionné en premier.

0

Si vous êtes dans le même serveur, vous pouvez le faire:

$contents = ftp_nlist($conn_id, '/'); 
// set the path to the folder 
$path = '/home/user/public_html/my_folder/'; 
foreach ($contents as $item) { 
    if (is_file($path . $item)) { 
     echo $item . PHP_EOL; 
    } else { 
     continue; 
    } 
} 

Pour serveur distant, vous pouvez vérifier si le fichier existe with other methods.

Questions connexes