Помогите! PHP, пытающийся передать FTPS, создает пустые файлы

Всем привет. В настоящее время я пытаюсь использовать 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. Мы так и не смогли пройти этот маршрут, поскольку это серьезное изменение в нашей среде.

Любая помощь приветствуется! Если я не понимаю некоторых бит, просто укажите, где вам нужно разъяснение. Благодаря!

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

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

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

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

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

Просто исправление кода в выбранном ответе (не может быть опубликовано как комментарий из-за недостаточных точек ответа):

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

  CURLOPT_URL => $remoteDir, CURLOPT_RETURNTRANSFER => 1