PHP при попытке передачи FTPS создает пустые файлы - PullRequest
0 голосов
/ 30 августа 2010

В настоящее время я пытаюсь использовать PHP для передачи небольших файлов между нашим сервером и удаленным сервером FTPS (FTP через 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, поэтому я не могу использовать ftp_ssl_connect () без компиляции наших собственных двоичных файлов PHP.Мы все равно не могли пойти по этому пути, так как это серьезное изменение в нашей среде.

Ответы [ 3 ]

1 голос
/ 13 сентября 2010

Мне просто нужно было сделать что-то очень похожее.

Я нашел решение здесь: 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);
    }

}
1 голос
/ 28 августа 2013

Просто исправление кода в выбранном ответе:

Строки 11 и 12 должны гласить:

    CURLOPT_URL => $remoteDir,
    CURLOPT_RETURNTRANSFER => 1
1 голос
/ 30 августа 2010

Документация PHP FTP / FTPS говорит:

Примечание: добавление
Начиная с PHP 5.0.0, файлы могут быть добавлены через упаковщик URL ftp: //. В предыдущих версиях попытка добавить файл через ftp: // приведет к сбою.

Вы уверены, что используете PHP> = 5.0.0. Или вы можете попробовать его с флагом FILE_TEXT вместо FILE_APPEND.

...