0

現在、PHP を使用して、サーバーとリモート FTPS (FTP over SSL) サーバー間で小さなファイルを転送しようとしています。私は、次のストリーム コンテキストを使用して、これを行うための標準的なフェアです。つまり、file_put_contents、file_get_contents などです。

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_ssl_connect() を使用することはできません。環境の大きな変化なので、とにかくこの道を進むことはできませんでした。

4

3 に答える 3

1

私はちょうど非常に似たようなことをしなければなりませんでした。

私はここで解決策を見つけました:http ://www.php.net/manual/en/function.curl-setopt.php#90988

私はこうしてそれをクラスに包むことになった:

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);
    }

}
于 2010-09-13T07:40:03.217 に答える
1

PHP FTP/FTPS ドキュメントには次のように書かれています。

注:
追加 PHP 5.0.0 以降、ファイルは ftp:// URL ラッパーを介して追加できます。以前のバージョンでは、ftp:// 経由でファイルに追加しようとすると失敗します。

PHP >= 5.0.0 を使用していますか? FILE_TEXTまたは、の代わりに flag を使用して試すこともできますFILE_APPEND

于 2010-08-30T04:43:08.847 に答える
1

選択した回答のコードを修正するだけです:

11 行目と 12 行目は次のようになります。

    CURLOPT_URL => $remoteDir,
    CURLOPT_RETURNTRANSFER => 1
于 2013-08-28T12:57:24.907 に答える