2010-11-03 21 views
7

Quiero imprimir la lista de archivos y solo archivos de un servidor FTP, esto es lo que pude lograr.Obtener la lista de archivos a través de 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); 
?> 

pero esto imprime los nombres de archivos y carpetas. ¿Cómo puedo imprimir sólo los nombres de los archivos (archivos pueden no tener las extensiones!)

Respuesta

5

Opciones:

1) Puede utilizar ftp_rawlist en lugar de ftp_nlist para obtener la lista completa para el archivo/directorio, que debe indicar si es un directorio Sin embargo, el formato de esa lista dependerá del sistema operativo del servidor ftp. Por ejemplo, en un sistema/Linux UNIX la lista sin procesar podría ser algo como esto:

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

donde la "d" en la primera columna le dirá que es un directorio. No estoy seguro de cómo se vería en un servidor de Windows.

2) para cada nombre de archivo que devuelva, intente introducir el CD en él. Si puedes, ¡es un directorio!

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

¿no sería mejor hacer 'if (! Ftp_chdir (....) {/ * FILE * /} else {/ * UP * /}' – RobertPitt

+0

@JacobM: funcionó, pero dio el siguiente error: (Advertencia: ftp_chdir() [function.ftp-chdir]: /index.php: ningún archivo o directorio en C: \ wamp \ www \ Contact_Keeper \ copyftp.php) en la línea 14 para cada archivo que encontró ... y para la estructura debería ser ftp_chdir ($ ftp_stream, $ directory) (lo obtuvo del dreamweaver) – sikas

+0

@RobertPitt: Sí, eso es más legible y se ajusta mejor a las necesidades del OP. ¡Solo quería que mi ejemplo fuera corto! –

3

Aquí es un script que lo hará por usted, cortesía de un cartel en 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

Esto funcionó para mí, pero recomendaría silenciar el ftp_chdir con @ftp_chdir en la función, ya que escupirá advertencias al intentar ingresar archivos. – Gazillion

+0

Hecho, gracias ... –

+0

Su código no funciona para mí. la función siempre devuelve falso. ¡Piensa que todos son archivos, no directorio! –

0

si se utiliza el ftp_rawlist así:

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

debe obtener más cerca de tu objetivo.

+2

Esto no funcionará si el servidor FTP es una máquina con Windows (y no se ha configurado para usar el formato Unix, lo que se puede hacer). En ese caso, tendrías que buscar el '

' en la lista. –

0

También podría usar la función ftp_mdtm(). Esto siempre devuelve un error (-1) cuando falla, lo que indicaría un directorio, ya que esta función no funciona para los directorios. La única advertencia es que no funciona en algunos sistemas (el manual no indica cuáles), por lo que necesitaría probar si funcionó primero.

0

Si se encuentra en el mismo servidor, puede hacerlo:

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

Por servidor remoto se puede comprobar si existe el archivo with other methods.

Cuestiones relacionadas