2010-11-03 37 views
7

Tôi muốn in danh sách tệp và chỉ tệp từ máy chủ FTP, dưới đây là những gì tôi có thể thực hiện.Lấy danh sách tệp qua 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); 
?> 

nhưng điều này sẽ in tên tệp và thư mục. Làm thế nào tôi có thể chỉ in tên của file (tập tin có thể không có phần mở rộng!)

Trả lời

5

Options:

1), bạn có thể sử dụng ftp_rawlist thay vì ftp_nlist để có được danh sách đầy đủ cho các tập tin/thư mục, trong đó cần nêu rõ cho dù đó là một thư mục. Tuy nhiên, định dạng của danh sách đó sẽ phụ thuộc vào hệ điều hành của máy chủ FTP. Ví dụ: trên hệ thống unix/linux, danh sách thô có thể trông giống như sau:

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

trong đó cột "d" trong cột đầu tiên sẽ cho bạn biết đó là thư mục. Bạn không chắc chắn nó sẽ trông như thế nào trên một máy chủ Windows.

2) cho mỗi tên tệp bạn trả lại, hãy thử CD vào đó. Nếu bạn có thể, đó là một thư mục!

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

sẽ không tốt hơn nếu bạn làm 'if (! Ftp_chdir (....) {/ * FILE * /} khác {/ * UP * /}' – RobertPitt

+0

@JacobM: nó đã hoạt động nhưng đã đưa ra lỗi sau: (Cảnh báo: ftp_chdir() [function.ftp-chdir]: /index.php: Không có tệp hoặc thư mục nào trong C: \ wamp \ www \ Contact_Keeper \ copyftp.php) trên dòng 14 cho mỗi tệp mà nó tìm thấy ... và cho cấu trúc nó phải là ftp_chdir ($ ftp_stream, $ directory) (đã nhận nó từ dreamweaver) – sikas

+0

@RobertPitt: Vâng, đó là dễ đọc hơn và phù hợp với nhu cầu của OP tốt hơn Tôi chỉ muốn làm ví dụ của tôi ngắn! –

3

Dưới đây là một kịch bản mà sẽ làm điều đó cho bạn, lịch sự của một poster trên 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

Điều này làm việc cho tôi nhưng tôi khuyên bạn nên im lặng ftp_chdir bằng @ftp_chdir trong chức năng nếu vì nó sẽ nhổ ra cảnh báo khi cố gắng nhập tệp. – Gazillion

+0

Xong, cảm ơn ... –

+0

Mã của bạn không hoạt động cho tôi. hàm luôn trả về false. Nó nghĩ rằng tất cả các tập tin không phải là thư mục !!! –

0

nếu bạn sử dụng ftp_rawlist như vậy:

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

nên giúp bạn gần hơn với mục tiêu của bạn.

+2

Thao tác này sẽ không hoạt động nếu máy chủ FTP là máy Windows (và chưa được định cấu hình để sử dụng định dạng Unix, có thể thực hiện được). Trong trường hợp đó, bạn phải tìm kiếm '

' trong danh sách. –

0

Bạn cũng có thể sử dụng chức năng ftp_mdtm(). Điều này luôn luôn trả về một lỗi (-1) khi nó không thành công mà sẽ chỉ ra một thư mục vì chức năng này không hoạt động cho các thư mục. Một trong những caveat là nó không hoạt động trên một số hệ thống (hướng dẫn không nêu những cái nào), vì vậy bạn cần phải kiểm tra nếu nó làm việc đầu tiên.

0

Nếu bạn đang ở trong cùng một máy chủ, bạn có thể làm:

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

Đối với máy chủ từ xa mà bạn có thể kiểm tra nếu tập tin tồn tại with other methods.

Các vấn đề liên quan