2010-08-30 7 views
0

J'essaie actuellement d'utiliser PHP pour transférer de petits fichiers entre notre serveur et un serveur distant FTPS (FTP sur SSL). Je suis la juste standard pour réaliser ce but, à savoir, file_put_contents, file_get_contents, etc ... avec le contexte de flux suivant:PHP essayant le transfert FTPS crée des fichiers vides

stream_context_create(array('ftp' => array('overwrite' => true), 'ssl' => array('allow_self_signed' => true))) 

Je passe ce flux de contexte en utilisant le code suivant. Il peut très bien se connecter au serveur FTPS, mais quand il s'agit de créer le fichier distant, le fichier lui-même est complètement vide. Vide comme en 0 pour la taille du fichier.

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

L'emplacement de fichier distant, soit $ this-> url, est dans le format suivant: "FTPS: // {user}: {} @ {passer hôte}: {port}"

Nous utilisons actuellement l'installation de Windows/Apache, donc je ne peux pas utiliser ftp_ssl_connect() sans compiler nos propres binaires PHP. Nous ne pouvions pas suivre cette voie, car c'est un changement majeur dans notre environnement.

Répondre

1

Je viens de faire quelque chose de très similaire.

J'ai trouvé la solution ici: http://www.php.net/manual/en/function.curl-setopt.php#90988

Je l'ai fini par envelopper dans une classe ainsi:

class ftps { 

    /** 
    * @param string $remoteDir Fully quantified path to the directory, eg ftp://foo:[email protected]/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); 
    } 

} 
+0

Jamais, jamais faire cela. En désactivant la vérification des homologues et des hôtes, vous invalidez complètement le cryptage, car toute personne intéressée peut utiliser une attaque MitM pour lire votre transfert. Si vous souhaitez désactiver la vérification de cette manière, n'utilisez pas SSL/TLS. – rdlowrey

+0

D'accord. Cela invaliderait le point de SSL si vous ne pouvez pas dire que votre trafic n'est pas intercepté. Savez-vous comment vous pouvez surmonter le problème OP si vous n'avez pas de contrôle sur le serveur distant? Je serais super désireux de savoir. – Drew

+0

Il est impossible de savoir sans voir le code réel de l'OP. L'extrait publié est incomplet. Il échoue également à vérifier l'homologue dans son contexte de flux, il n'est donc pas plus sûr que de désactiver la vérification en utilisant curl. – rdlowrey

1

Le PHP FTP/FTPS Documentations dit:

Note:
Ajout des fichiers PHP Comme 5.0.0 peuvent être ajoutés via le ftp: // wrapper URL. Dans les versions précédentes, tenter d'ajouter à un fichier via ftp: // entraînera un échec. Êtes-vous sûr de vouloir utiliser PHP> = 5.0.0?

Ou vous pouvez l'essayer avec le drapeau FILE_TEXT au lieu de FILE_APPEND.

1

Juste une correction au code dans la réponse choisie:

lignes 11 et 12 devrait se lire:

CURLOPT_URL => $remoteDir, 
    CURLOPT_RETURNTRANSFER => 1 
+0

+1 pour revenir à un sujet aussi ancien! Merci. :) –

+0

De rien! C'est Google qui m'a conduit ici pendant que je cherchais ceci :) –

+0

Merci, ont fixé cela dans la réponse. – Drew