Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过FTP获取文件列表_Php_Ftp - Fatal编程技术网

Php 通过FTP获取文件列表

Php 通过FTP获取文件列表,php,ftp,Php,Ftp,我想打印文件列表,并且只打印来自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服务器的文件,以下是我可以完成的

<?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);
?>

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

选项:

1) 您可以使用
ftp\u rawlist
而不是
ftp\u 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!
}

下面是一个脚本,它将为您完成这一任务,这是一张海报提供的:


如果您这样使用ftp\u列表:

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

应该会让你更接近你的目标。

你也可以使用
ftp\u mdtm()
函数。当失败时,它总是返回一个错误(-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;
    }
}

对于远程服务器,您可以检查文件是否存在。

@JacobM:它工作正常,但出现以下错误:(警告:ftp\u chdir()[function.ftp chdir]:/index.php:在第14行的C:\wamp\www\Contact\u Keeper\copyftp.php中,对于找到的每个文件,都没有这样的文件或目录。。。对于结构来说,它应该是ftp_chdir($ftp_stream,$directory)(从dreamweaver那里获得)@RobertPitt:是的,它更可读,更适合OP的需要。我只是想让我的例子简短一点@RobertPitt:我只需要特定文件夹中的文件。@JacobM:我通过添加错误报告(0)解决了错误;@sikas:如果警告有问题,您可以将
ftp\u chdir
更改为
@ftp\u chdir
以抑制警告,但请注意,这也会抑制合法错误(例如,网络已关闭)。如果ftp服务器是Windows计算机,则此操作不起作用(并且尚未配置为使用Unix格式,这是可以完成的)。在这种情况下,您必须在列表中查找
。这对我很有效,但我建议在函数的if中使用@ftp\u chdir使ftp\u chdir静音,因为它在尝试输入文件时会发出警告。您的代码对我不起作用。函数总是返回false。它认为所有文件都不是目录!!!
$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;
    }
}