PHP尝试FTPS传输时会创建空文件

PHP尝试FTPS传输时会创建空文件,php,ssl,ftp,ftps,Php,Ssl,Ftp,Ftps,我目前正在尝试使用PHP在服务器和远程FTPS(FTP over SSL)服务器之间传输小文件。我是完成这项工作的标准,即,文件内容、文件内容等等。。。使用以下流上下文: stream_context_create(array('ftp' => array('overwrite' => true), 'ssl' => array('allow_self_signed' => true))) 我使用以下代码传递这个上下文流。它可以很好地连接到FTPS服务器,但在创建远程文

我目前正在尝试使用PHP在服务器和远程FTPS(FTP over SSL)服务器之间传输小文件。我是完成这项工作的标准,即,文件内容、文件内容等等。。。使用以下流上下文:

stream_context_create(array('ftp' => array('overwrite' => true), 'ssl' => array('allow_self_signed' => true)))
我使用以下代码传递这个上下文流。它可以很好地连接到FTPS服务器,但在创建远程文件时,文件本身完全是空的。文件大小为0时为空

    if(false === file_exists($localFile))
    {
        throw new Exception("Local file, {$localFile}, does not exist.");
    }

    if(false === $localFileContents = file_get_contents($localFile))
    {
        throw new Exception("Could not open Local file, {$localFile}.");
    }

    if(false === file_put_contents("{$this->url}{$remoteFile}", $localFileContents, FILE_APPEND, $this->context))
    {
        throw new Exception("Could not write to remote file, {$remoteFile}.");
    }
远程文件位置,即$this->url,采用以下格式:“ftps://{user}:{pass}@{host}:{port}”

我们目前正在使用Windows/Apache安装程序,因此如果不编译我们自己的PHP二进制文件,我就无法使用ftp\u ssl\u connect()。我们无论如何都不能走这条路,因为这是我们环境的重大变化。

上面说:

注意:追加
从PHP 5.0.0开始,可以通过ftp://URL包装器附加文件。在以前的版本中,尝试通过ftp://附加到文件将导致失败

您确定使用的是PHP>=5.0.0吗。或者您可以使用
FILE\u TEXT
标志来代替
FILE\u APPEND

报告说:

注意:追加
从PHP 5.0.0开始,可以通过ftp://URL包装器附加文件。在以前的版本中,尝试通过ftp://附加到文件将导致失败


您确定使用的是PHP>=5.0.0吗。或者您可以使用
FILE\u TEXT
标志来代替
FILE\u APPEND

我刚刚不得不做一些非常类似的事情

我在这里找到了解决方案:

最后我在课堂上把它包装起来:

class ftps {

    /**
     * @param string $remoteDir Fully quantified path to the directory, eg ftp://foo:bar@blergh.com/directory/
     */
    public function ls($remoteDir) {

        $connection = $this->initConnection();

        curl_setopt_array($connection, array(
            CURLOPT_URL => $remoteDir,
            CURLOPT_RETURNTRANSFER => 1
        ));

        $result = curl_exec($connection);

        $this->finishConnection($connection);

        return explode("\n", $result);

    }

    private function initConnection()
    {
        $connection = curl_init();

        curl_setopt_array($connection, array(
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_FTP_SSL => CURLFTPSSL_TRY
        ));

        return $connection;
    }

    private function finishConnection(&$connection)
    {
        curl_close($connection);
        unset($connection);
    }

}

我不得不做一些非常相似的事情

我在这里找到了解决方案:

最后我在课堂上把它包装起来:

class ftps {

    /**
     * @param string $remoteDir Fully quantified path to the directory, eg ftp://foo:bar@blergh.com/directory/
     */
    public function ls($remoteDir) {

        $connection = $this->initConnection();

        curl_setopt_array($connection, array(
            CURLOPT_URL => $remoteDir,
            CURLOPT_RETURNTRANSFER => 1
        ));

        $result = curl_exec($connection);

        $this->finishConnection($connection);

        return explode("\n", $result);

    }

    private function initConnection()
    {
        $connection = curl_init();

        curl_setopt_array($connection, array(
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_FTP_SSL => CURLFTPSSL_TRY
        ));

        return $connection;
    }

    private function finishConnection(&$connection)
    {
        curl_close($connection);
        unset($connection);
    }

}

仅对所选答案中的代码进行更正:

第11行和第12行应改为:

    CURLOPT_URL => $remoteDir,
    CURLOPT_RETURNTRANSFER => 1

仅对所选答案中的代码进行更正:

第11行和第12行应改为:

    CURLOPT_URL => $remoteDir,
    CURLOPT_RETURNTRANSFER => 1

不客气!当我搜索这个时,是谷歌把我带到了这里:)谢谢,我已经在答案中解决了这个问题。不客气!当我在搜索时,是谷歌把我带到了这里:)谢谢,我已经在答案中解决了这个问题。永远不要这样做。通过禁用对等验证和主机验证,您将完全使加密无效,因为任何关心的人都可以使用MitM攻击来读取您的传输。如果要以这种方式禁用验证,就不用麻烦使用SSL/TLS。如果你不能判断你的流量没有被截获,那么SSL的作用就失效了。如果您无法控制远程服务器,您知道如何克服OPs问题吗?我非常想知道。不看OP的实际代码是不可能知道的。发布的代码片段不完整。它也无法在其流上下文中验证对等方,因此它并不比使用curl禁用验证更安全。通过禁用对等验证和主机验证,您将完全使加密无效,因为任何关心的人都可以使用MitM攻击来读取您的传输。如果要以这种方式禁用验证,就不用麻烦使用SSL/TLS。如果你不能判断你的流量没有被截获,那么SSL的作用就失效了。如果您无法控制远程服务器,您知道如何克服OPs问题吗?我非常想知道。不看OP的实际代码是不可能知道的。发布的代码片段不完整。它也无法在其流上下文中验证对等方,因此它并不比使用curl禁用验证更安全。