2010-11-03 5 views
7

Desidero stampare l'elenco di file e solo file da un server FTP, ecco cosa potrei realizzare.Ottenere l'elenco dei file tramite 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); 
?> 

ma questo stampa i nomi di file e cartelle. Come posso semplicemente stampare i nomi dei file (file non possono avere estensioni!)

risposta

5

Opzioni:

1) È possibile utilizzare ftp_rawlist invece di ftp_nlist per ottenere la lista completa per il file/directory, che dovrebbe indicare che si tratti di una directory. Tuttavia, il formato di tale elenco dipenderà dal sistema operativo del server ftp. Ad esempio, su un sistema Unix/Linux esistente lista grezzo potrebbe essere simile a questo:

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

dove la "d" nella prima colonna vi dirà che è una directory. Non so come apparirebbe su un server Windows.

2) per ogni nome di file che si restituisce, provare a CD in esso. Se puoi, è una directory!

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

non sarebbe meglio fare 'if (! Ftp_chdir (....) {/ * FILE * /} else {/ * UP * /}' – RobertPitt

+0

@JacobM: ha funzionato ma ha dato il seguente errore: (Attenzione: ftp_chdir() [function.ftp-chdir]: /index.php: Nessun file o directory in C: \ wamp \ www \ Contact_Keeper \ copyftp.php) sulla riga 14 per ogni file trovato ... e per la struttura dovrebbe essere ftp_chdir ($ ftp_stream, $ directory) (ottenuto da dreamweaver) – sikas

+0

@RobertPitt: Sì, è più leggibile e si adatta meglio agli OP. Volevo solo rendere il mio esempio breve! –

3

Ecco uno script che lo farà per voi, per gentile concessione di un poster sul 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

Questo ha funzionato per me ma raccomanderei di silenziare ftp_chdir con @ftp_chdir nella funzione if, perché sputerebbe degli avvertimenti quando provate ad inserire i file. – Gazillion

+0

Fatto, grazie ... –

+0

Il tuo codice non funziona per me. la funzione restituisce sempre false. Pensa che tutti siano file non directory !!! –

0

se si utilizza il ftp_rawlist in questo modo:

$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]); 
    } 
} 

dovrebbe farti più vicino al tuo obiettivo.

+2

Questo non funzionerà se il server FTP è una macchina Windows (e non è stato configurato per usare la formattazione Unix, cosa che si può fare). In tal caso, dovresti cercare "

" nell'elenco. –

0

È inoltre possibile utilizzare la funzione ftp_mdtm(). Questo restituisce sempre un errore (-1) quando fallisce che indicherebbe una directory poiché questa funzione non funziona per le directory. L'unica avvertenza è che non funziona su alcuni sistemi (il manuale non specifica quali), quindi è necessario testare se ha funzionato prima.

0

Se siete sullo stesso server, si può fare:

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

Per server remoto è possibile controllare se il file esiste with other methods.