11 Stimmen

Abrufen der Dateiliste über FTP

Ich möchte die Liste der Dateien und nur Dateien von einem FTP-Server zu drucken, hier ist, was ich erreichen konnte.

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

aber das gibt die Namen von Dateien und Ordnern aus. Wie kann ich nur die Namen der Dateien drucken (Dateien dürfen keine Erweiterungen haben!)?

11voto

Jacob Mattison Punkte 48729

Optionen:

1) Sie können verwenden ftp_rawlist anstelle von ftp_nlist um die vollständige Liste der Datei bzw. des Verzeichnisses zu erhalten, aus der hervorgehen sollte, ob es sich um ein Verzeichnis handelt. Das Format dieser Liste hängt jedoch vom Betriebssystem des FTP-Servers ab. Auf einem Unix/Linux-System könnte die Rohauflistung zum Beispiel so aussehen:

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

wobei das "d" in der ersten Spalte anzeigt, dass es sich um ein Verzeichnis handelt. Ich weiß nicht, wie es auf einem Windows-Server aussehen würde.

2) Versuchen Sie für jeden Dateinamen, den Sie zurückgeben, eine CD zu erstellen. Wenn du das kannst, ist es ein Verzeichnis!

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

6voto

Justin Ethier Punkte 126797

Hier ist ein Skript, das dies für Sie erledigt, freundlicherweise zur Verfügung gestellt von einem Poster auf ftp_nlist (PHP-Dokumente) :

<?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";
  }
}
?>

2voto

Lee Blake Punkte 301

Sie können auch die ftp_mdtm() Funktion. Diese gibt immer einen Fehler (-1) zurück, wenn sie fehlschlägt, was auf ein Verzeichnis hinweisen würde, da diese Funktion nicht für Verzeichnisse funktioniert. Der einzige Nachteil ist, dass sie auf einigen Systemen nicht funktioniert (das Handbuch gibt nicht an, auf welchen), also müssen Sie zuerst testen, ob sie funktioniert.

1voto

RobertPitt Punkte 55763

Wenn Sie die ftp_rawlist wie folgt verwenden:

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

Das sollte Sie Ihrem Ziel näher bringen.

1voto

aesede Punkte 5313

Wenn Sie sich auf demselben Server befinden, können Sie das tun:

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

Für einen entfernten Server können Sie prüfen, ob die Datei existiert mit anderen Methoden .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X