2015-03-27 1 views
1

У меня есть файл на FTP с динамическим именем файла. Схема выглядит примерно так:Использование PHP ftp_get() для извлечения файла с подстановочным именем файла

ABCD_2_EFGH_YYMMDD_YYMMDD_randomnumber_.TXT 

Даты (YYMMDD) отражают предыдущий день и текущий день и значение randomnumber является подсчет записей в файле и меняется каждый день.

Я пытаюсь извлечь файл с помощью PHP, но у меня возникли проблемы с использованием подстановочного имени. Вот пример кода:

<?php 
$yesterday = strtotime('-1 day', time()); 
$today = strtotime('-0 day', time()); 
$local_file = "ABCD_2_EFGH__".date('Y-m-j', $yesterday).".txt"; 
$server_file = "ABCD_2_EFGH_".date('ymd', $yesterday)."_".date('ymd', $today)."_*.txt"; 

$conn_id = ftp_connect(ftpaddress); 
$login_result = ftp_login($conn_id, 'username', 'password'); 
ftp_chdir($conn_id, 'subdirectory name'); 
ftp_get($conn_id, $local_file, $server_file, FTP_BINARY); 
?> 

При выполнении этого кода я получаю следующее сообщение об ошибке:

ftp_get() expects parameter 3 to be a valid path

Я также попытался с помощью glob() для $server_file и получить ту же ошибку.

Кто-нибудь знает, как использовать динамические имена файлов с ftp_get()?

ответ

0

ftp_get можно скачать только для одного файла. Подстановочные знаки не поддерживаются.


Единственный надежный способ перечислить все файлы, фильтровать их локально, а затем загрузить их один за другим:

$conn_id = ftp_connect("ftp.example.com") or die("Cannot connect"); 
ftp_login($conn_id, "username", "password") or die("Cannot login"); 
ftp_pasv($conn_id, true) or die("Cannot change to passive mode"); 

$files = ftp_nlist($conn_id, "/path"); 

foreach ($files as $file) 
{ 
    if (preg_match("/\.txt$/i", $file)) 
    { 
     echo "Found $file\n"; 
     // download with ftp_get 
    } 
} 

Некоторые (большинство) серверов позволит вам использовать подстановочные напрямую :

$conn_id = ftp_connect("ftp.example.com") or die("Cannot connect"); 
ftp_login($conn_id, "username", "password") or die("Cannot login"); 
ftp_pasv($conn_id, true) or die("Cannot change to passive mode"); 

$files = ftp_nlist($conn_id, "/path/*.txt"); 

foreach ($files as $file) 
{ 
    echo "Found $file\n"; 
    // download with ftp_get 
} 

Но это нестандартная функция (хотя широко поддерживается).

Подробнее см. Мой ответ FTP directory partial listing with wildcards.

+0

Это не работает – threeFatCat

+0

** Примечание **: 'Эта функция не будет работать с удаленными файлами, поскольку файл будет рассматриваться должны быть доступны через filesystem.' сервера – AbraCadaver

+0

@ AbraCadaver True. Я удалил часть «glob». –

0

Вы можете использовать ftp_nlist с рисунком, чтобы восстановить имена файлов из ftp-папки. А затем использовать ftp_get в цикле

$fileList = ftp_nlist($conn_id, 'subdirectory_name/file_prefix_*.txt'); 

for ($i = 0; $i < count($fileList); $i++) { 
    $localFile = tempnam(sys_get_temp_dir(), 'ftp_in'); 
    if (ftp_get($conn_id, $localFile, $fileList[$i], FTP_BINARY)){ 
     //do something 
    } 
}