Получение списка файлов по FTP - PullRequest
10 голосов
/ 03 ноября 2010

Я хочу напечатать список файлов и только файлы с 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 ]

8 голосов
/ 03 ноября 2010

Опции:

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!
}
4 голосов
/ 03 ноября 2010

Вот скрипт, который сделает это за вас, благодаря плакату на 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";
  }
}
?>
1 голос
/ 03 ноября 2015

Если вы находитесь на том же сервере, вы можете сделать:

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

Для удаленного сервера вы можете проверить, существует ли файл другими методами .

1 голос
/ 07 сентября 2013

Вы также можете использовать функцию ftp_mdtm(). Это всегда возвращает ошибку (-1), когда это терпит неудачу, которая указала бы на каталог, так как эта функция не работает для каталогов. Единственное предостережение в том, что он не работает в некоторых системах (в руководстве не указано, какие из них), поэтому вам нужно проверить, работает ли он первым.

1 голос
/ 03 ноября 2010

, если вы используете 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]);
    }
}

Должен приблизить вас к цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...