Laravel

时间:2018-04-09 20:35:27

标签: php laravel coldfusion ftp

我有一个ColdFusion页面,在该页面上与远程ftp服务器建立了安全的FTP连接,并列出了该服务器上某个目录中所有文件的名称(在查询对象中)。这在CF中相对简单 - 您使用cfftp标签打开ftp连接,然后再次使用cfftp标签列出特定目录中的文件:

<cfftp action = "open"
              username = "username"
              connection = "myConnection"
              password = "password"
              fingerprint = "(eight pairs of hexadecimal values in the form 
              hh:hh:hh:hh:hh:hh:hh:hh)"
              server = "xxx.xxx.xx.xx"
              secure = "yes">

    <cfftp action = "listDir"
                connection="myConnection"
                directory="Output_Directory"
                name="qDir" />
<!--- Files in the specified directory are now stored in a query object named "qDir", and their filenames can be pulled using a CF query of query --->

我是PHP / Laravel的新手,我正试图弄清楚如何在Laravel中做同样的事情。到目前为止,我还没有找到任何视频或教程来解释如何在Laravel中打开ftp连接(正常或安全),或者在连接完成后如何查看目录中的文件。

我确实在https://laravel.com/docs/5.6/filesystem#downloading-files找到了一些关于SFTP驱动程序配置的filesystems.php页面的内容。我收集的内容需要先设置,然后才能在Laravel网站中打开任何SFTP连接。但是,我发现这有点令人困惑。如下所示,该代码似乎需要“privateKey”和“password”的值,并且不包括“指纹”的可选设置,我将其包含在上面的CFFTP标记中。

//include on filesystems.php:

'sftp' => [
    'driver' => 'sftp',
    'host' => 'example.com',
    'username' => 'your-username',
    'password' => 'your-password',

    // Settings for SSH key based authentication...
    // 'privateKey' => '/path/to/privateKey',
    // 'password' => 'encryption-password',

    // Optional SFTP Settings...
    // 'port' => 22,
    // 'root' => '',
    // 'timeout' => 30,
],

我可以通过ftp客户端(Bitvise)安全地连接到ftp服务器,该客户端只询问用户名,密码,主机IP和端口(22)。所以我不确定需要为上面的代码提供什么“privateKey”或“password”值...也不知道'sftp'数组中有两个名为“password”的变量(一个用于“你的密码”) “和一个用于”加密密码“)。

Laravel似乎总体上有很好的教程视频 - 任何人都可以指向任何涉及ftp / sftp的地方,特别是“open”和“listDir”类型的动作吗? (我正在寻找Laravel - 我可以弄清楚它是如何在我自己的香草PHP中完成的)。非常感谢。

(附录)稍后在此处添加此内容,以便我可以在代码格式中包含以下内容。我认为我需要做的一件事是使用ftp文件系统驱动程序,而不是sftp文件系统驱动程序,并将'ssl'设置为true。所以在filesystems.php上,我应该有类似的东西:

'ftp' => [
            'driver'   => 'ftp',
            'host'     => env('FTP_SERVER'),
            'port'     => 22,//env('FTP_PORT'),
            'username' => env('FTP_USERNAME'),
            'password' => env('FTP_PASSWORD'),
            'passive'  => true,
            'ssl'      => true,
            'timeout'  => 30,
            'root'     => '/',
        ],

仍在努力建立联系;虽然。当我尝试这样做时,我收到一条错误消息:“使用未定义的常量FTP_BINARY - 假定'FTP_BINARY'”。想出这个问题 - 是因为我需要在php配置中启用php_ftp.dll,因为在Windows上默认没有启用。但现在我收到一条不同的错误信息 - “无法连接到主机xxx.xxx.xx.xx端口:22”。将深入研究,看看问题是什么并报告回来。

(稍后)看起来我遇到了某种身份验证问题。我尝试使用vanilla PHP连接到同一个FTP服务器,即ftp_ssl_connect()函数。该函数返回false,表示连接错误。 (在我启用php_ftp.dll之前,我只是收到一条错误消息,说ftp_ssl_connect()是一个未定义的函数)。想知道是否省略了我们以前作为Coldfusion cfftp标签的参数包含的指纹,它与它有关。但这不是Laravel或核心PHP函数中的可能参数。挖掘...将报告回来......

(18年4月11日)   关键问题似乎是cfftp标签究竟发生了什么,以及它如何建立连接(sFTP或FTPS?)因为它的工作正是我们想要在PHP / Laravel中重新创建的。我已经就此问了一个单独的问题。

cfftp标签的文档没有说明使用sFTP或FTPS。它只表示当您指定secure =“yes”时,它允许您使用对称或非对称加密打开与Secure Shell(SSH)服务器的连接。使用对称加密(我们正在做的事情)时,你会传递用户名,密码和指纹(我们这样做)。

您可以在cfftp标记中指定端口;如果没有指定端口,那么它默认为21.作为测试,我已经明确地将端口作为21和22传递,并且在两种情况下连接都正常。我不确定为什么会这样;我希望它能在一个案例或另一个案例中发挥作用,但不能同时发挥作用。

同时,如果我们确实需要使用SFTP,我已经尝试使用ssh2_connect()函数与核心PHP中的ftp服务器建立SFTP连接。我收到一条错误消息,说这个函数是未定义的,即使我已经添加并启用了php_ssh2.dll扩展,所以这是另一回事。

1 个答案:

答案 0 :(得分:1)

privateKey字段是您正在使用公钥验证 你的SSH连接。公钥身份验证用作标准用户名/密码身份验证的替代方法。它通常被认为比用户名/密码更安全。 Here's a decent primer

Laravel的SFTP文件系统驱动程序使用PHP联盟的flysystem-sftphttps://github.com/thephpleague/flysystem-sftp

如果您选择不使用公钥身份验证,则可以将该字段注释掉。第二个password条目可能只是文档中的拼写错误;请参阅flysystem-sftp项目了解实际配置语法。