1

我尝试读取目录并想从当前日期获取最后一个文件。

当我将 url 放入浏览器时,我得到了 ftp 目录中所有文件的结果。

所以我有证据证明 ftp-connection 参数仍然有效。

在此处输入图像描述

当我尝试启动以下功能时,出现错误

RecursiveDirectoryIterator::__construct( ftp://...@example.com:4242 ): 未能打开 dir: 操作失败

这是 symfony 的异常:

在此处输入图像描述

/**
 * @Route("/download", name="getfile")
 */
public function getFileWithFtp()
{

    $host = "example.com";
    $username = "username";
    $userpass = "userpass";
    $port = 4242;


    $url = 'ftp://' . $username . ':' . $userpass . '@' . $host . ':' . $port .'/';
    $datum = date('Y-m-d');

    $finder = new Finder();
    $iterator = $finder
        ->files()
        ->in($url)
        ->name('*BEHWN.TXT')
        ->date($datum);

    $anzahl = count($iterator);

    return $this->render('ftp/index.html.twig', [
        'controller_name' => 'FtpController',
        'url' => $url,
        'anzahl' => $anzahl
    ]);
}

当我使用 file_gets_content($url."filename.txt") 打开带有文件的 url 时,我得到的内容没有错误。

只是似乎我不使用 Symfony 的 Finder 不正确。

我当前的 Symfony 是 4.1.4,我已经清除了缓存,还手动删除了缓存文件。

感谢每一个小费

这是 symfony-finder-component 的链接: https ://symfony.com/doc/current/components/finder.html

由于 Finder 使用 PHP 迭代器,您可以使用支持的协议传递任何 URL:

以下是文档中的 FTP 代码部分:

// always add a trailing slash when looking for in the FTP root dir
$finder->in('ftp://example.com/');

// you can also look for in a FTP directory
$finder->in('ftp://example.com/pub/');
4

2 回答 2

0

如文档中所述,您在 $iterator 中拥有的是 PHP iterator,因此您需要使用iterator_count

$anzahl =  iterator_count($iterator);
于 2018-09-12T08:46:02.540 回答
0

如果您使用的是 symfony v3.4.7 及更高版本,这将不再起作用..

有问题: https ://github.com/symfony/symfony/issues/27423

我做了一个修复,但它需要一段时间才能合并我认为 https://github.com/symfony/symfony/pull/28604

概括:

“在 Finder[...] 中已发布,它应该从路径名中删除重复的斜杠。但是,当用于在 FTP 根目录中查找文件时,这会导致错误。”

“因此,v3.4.7 之前的工作代码会导致 v3.4.7 之后的代码中断”

这是把事情搞砸的方法,包括我的修复 https://github.com/symfony/symfony/blob/0670c48477b3d88787b6fe0dec168c5c8ae49c66/src/Symfony/Component/Finder/Finder.php#L741

于 2018-09-26T23:56:32.090 回答