获取FTP文件列表

11
我想打印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);
?>

但是这会打印文件和文件夹的名称。如何只打印文件的名称(文件可能没有扩展名!)

5个回答

11

选项:

1)您可以使用ftp_rawlist而不是ftp_nlist来获取文件/目录的完整列表,这应该指示它是否是目录。但是,该列表的格式取决于ftp服务器的操作系统。例如,在unix / linux系统上,原始列表可能如下所示:

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

第一列中的“d”表示它是一个目录。不确定在Windows服务器上会是什么样子。

2) 对于返回的每个文件名,尝试CD进入它。如果可以,那么它就是一个目录!

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!
}

@JacobM:它可以工作,但是出现了以下错误:(警告:ftp_chdir() [function.ftp-chdir]:/index.php:在C:\wamp\www\Contact_Keeper\copyftp.php的第14行找不到文件或目录)对于它发现的每个文件... 对于结构,应该是ftp_chdir($ftp_stream,$directory)(从dreamweaver中获取) - sikas
@RobertPitt:是的,那样更易读,也更符合OP的需求。我只是想让我的示例更简短! - Jacob Mattison
@RobertPitt:我只需要特定文件夹中的文件。 - sikas
@JacobM:我通过在文件开头添加error_reporting(0);解决了这个错误。 - sikas
1
@sikas:如果警告是一个问题,你可以将 ftp_chdir 改为 @ftp_chdir 来抑制警告,但要注意这也会抑制合法的错误(例如,网络已经断开)。 - Jacob Mattison
抱歉,但我认为我有更好的解决方案,因为我的方法不需要改变目录。 - RobertPitt

6
以下是一个脚本,可以帮助您完成此操作,这个脚本来自于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";
  }
}
?>

这对我有用,但我建议在函数的if中使用@ftp_chdir来消除ftp_chdir的警告,因为尝试进入文件时会产生警告。 - Gazillion
你的代码对我不起作用。该函数总是返回false。它认为所有的都是文件而不是目录! - Mahdi Jazini

2
您还可以使用ftp_mdtm()函数。当它失败时,它总是返回一个错误(-1),这表明这是一个目录,因为该函数不适用于目录。唯一的注意点是它在某些系统上无法工作(手册没有说明哪些系统),因此您需要先测试它是否有效。

1

如果你这样使用ftp_rawlist:

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

这应该能让你更接近你的目标。


2
如果FTP服务器是Windows机器(并且没有配置为使用Unix格式,这可以完成),则此方法将无法工作。在这种情况下,您必须在列表中查找“<dir>”。 - Jacob Mattison

1
如果您在同一服务器上,可以执行以下操作:

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

对于远程服务器,您可以使用其他方法检查文件是否存在


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接