【问题标题】:Get File from FTP server only for current date via FTP仅通过 FTP 从 FTP 服务器获取当前日期的文件
【发布时间】:2020-11-19 00:59:50
【问题描述】:

我正在尝试从 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 下载文件?

谢谢!

【问题讨论】:

    标签: php ftp


    【解决方案1】:

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

    $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 或发出ls 或使用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 扩展名。

    【讨论】:

    • 虽然这确实有效,但为每个文件使用ftp_mdtm 可能会非常低效。有关替代方案,请参阅How to get last modified text files by date from remote FTP location
    • @MartinPrikryl 谢谢,添加了注释和更好的查看。
    • 知道了,但 ftp_mlsd 始终为空。
    • 尚未测试它可能不需要通配符 *.csv 执行 print_r(ftp_mlsd($conn_id, "/MYDATA/)); 以查看是否有效。
    • 什么都没有发生。是空的
    猜你喜欢
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多