通过 FTP 从 FTP 服务器获取当前日期的文件

Get File from FTP server only for current date via FTP

我正在尝试从 FTP 获取最后修改日期为今天的文件。如果我知道文件名,这将非常有效。

在我的 FTP 服务器中,文件名是动态的。我只知道.csv 的文件扩展名,并且有一个 CSV 文件和许多其他不同的文件。

如何只获取最后修改日期为当前日期的 .csv 文件?一旦我得到它,我将从 FTP.

下载该文件

这是我尝试过的,只有在我知道文件名的情况下才能正常工作。

// connect and login to FTP server
$ftp_server = "ftp server details";
$ftp_username = 'ftp user';
$ftp_userpass = 'ftp pass';
$ftp_conn = ftp_connect($ftp_server) or die("Could not connect to $ftp_server");
$login = ftp_login($ftp_conn, $ftp_username, $ftp_userpass);

//hard coded file name. I want to get only .csv file (It is just one file)
$file = "/MYDATA/2020_10_27_15_00.csv";

date_default_timezone_set('Asia/Kolkata');
$currenttime = date( 'F d Y', strtotime( 'now' ) );

$lastchanged = ftp_mdtm($ftp_conn, $file);
if ($lastchanged != -1)
{
 
  $lastmodifieddate = date("F d Y", $lastchanged);
   
  if (strcmp($currenttime, $lastmodifieddate) == 0)
  {
      echo "$file was last modified on : " . date("F d Y", $lastchanged);
      //download the file
  }
  else
  {
      echo "No file for current date";
      //nothing to download
  }
  
}
else
{
  echo "Could not get last modified";
}

// close connection
ftp_close($ftp_conn);


?>

如何仅获取 .csv 扩展名的文件名,最后修改日期为当前日期并从 FTP 下载文件?

谢谢!

列出文件并循环它们,获取每个文件的修改日期并与今天的日期进行比较(未测试):

$files = ftp_nlist($ftp_conn, "/MYDATA/*.csv");
$today = date("Ymd");

foreach($files as $file) {
    $mtime = date("Ymd", ftp_mdtm($ftp_conn, $file));

    if($mtime == $today) {
        $found = $file;
        break;  // if there is only one or you only want one
    }
}

if(isset($found)) {
    echo "$found is today's date $today!";
    // download $found
} else {
    echo "No file found for today's date $today!";
}

如果可能有多个文件具有今天的日期,则分配给一个数组并对它们执行其他操作:

if($mtime == $today) {
    $found[] = $file;
}

注意:这个解决方案会很慢,尤其是对于很多文件。您可以查看 ftp_rawlist or issue a ls or similar command with sorting using ftp_raw 然后解析出日期。

感谢 Martin Prikryl 的评论,您也许可以做这样的事情,将文件信息放入多维数组并检查:

$files = ftp_mlsd($conn_id, "/MYDATA/*.csv");
$today = date("Ymd");

$found = array_filter($files, function($v) use($today) {
                                  return substr($v["modify"], 0, 8) == $today;
                              });

然后你可以得到名字:

$found = array_column($found, "name");

如果 ftp_mlsd 不接受通配符,那么您需要在过滤器代码中添加检查 $v["name"] 以获取 .csv 扩展名。