Antwort #5 am: 20. Februar 2015, 14:17:12
Ich muss in einen Ordner auf dem Webspace mit Rechten 700 CSV Dateien hoch und runter laden in denen sensible Daten stehen. die Dateien werden auf dem Webspace von einem PHP Script verarbeitet und anschließend umgehend gelöscht.
Da mein alter Provider SFTP unterstützt hatte, habe ich mir auf dem Lokalen xampp einfach phpseclib installiert. Ich konnte dann einfach in meiner Schnittstelle solche Codeblöcke einbauen:
// connectif ($SFTP_connection = New Net_SFTP
($FTP_server, 22)) { echo "<p>FTP Verbindung mit Server " . $FTP_server . " aufgebaut</p>";} else { die ("<p class='error'>FEHLER: keine Verbindung zum FTP Server </p>" . $FTP_server);}// authenticateif ($SFTP_connection->login($FTP_user, $FTP_pass)) { echo "<p>Erfolgreich am FTP Server " . $FTP_server . " authentifiziert</p>";} else { die ("<p class='error'>FEHLER: Authentifizierung am FTP Server" . $FTP_server . " fehlgeschlagen!</p>");}// change remote dirif (!$SFTP_connection->chdir($FTP_remotedir)) { die ("FEHLER: FTP Remoteverzeichnis " . $FTP_remotedir . " nicht gefunden!");}// get file and write to variable $Modified_Ordersif ($Modified_Orders = $SFTP_connection->get($FTP_file)) { echo "<p>Modified Shop Bestellungen erfolgreich heruntergeladen</p>";} else { die ("<p class='error'>FEHLER: FTP Datei " . $FTP_remotedir . "/" . $FTP_file . " konnte nicht heruntergeladen werden!</p>");} Da das nicht mehr funktioniert hat, war ich auf der Suche nach einer ähnlichen Klasse für FTPS, damit ich den Code nicht komplett umbauen muss.
Habe den Code jetzt aber komplett umgebaut und mir meine eigene Klasse als Notlösung mit wrapper geschrieben. Die ist aber noch völliger sch..., da sie überhaupt keine Fehler fängt und meine Schnittstelle Im Fehlerfall einfach weitermacht. Da ich einen Prozess in der Schnittstelle nicht manuell starte sondern über einen cronjob, ist das ganz schlecht. Außerdem habe ich keinerlei Kontrolle ob die Daten auch verschlüsselt sind, oder nur das Passwort.
<?phpclass ftps
{ private $local_root; private $remote_root; function __construct
() { global $FTP_server; global $FTP_user; global $FTP_pass; $this->connection_string = 'ftps://' . $FTP_user . ':' . $FTP_pass . '@' . $FTP_server . ':21/'; $this->ftp_connection_string = 'ftp://' . $FTP_user . ':' . $FTP_pass . '@' . $FTP_server . ':21/'; $this->local_root = $_SERVER['DOCUMENT_ROOT'] . "/Lexware_connector/"; $this->remote_root = 'httpdocs/'; } function remote_dir
($dir=null) { $dir_listing=array(); if ($handle = opendir($this->ftp_connection_string . $this->remote_root . $dir)) { while (false !== ($entry = readdir($handle))) { if ($entry != "." && $entry != "..") { $dir_listing[] = $entry; } } } closedir($handle); if (array_count_values($dir_listing)<1) { return false; } else { return $dir_listing; } } function put
($source,$target) { if (file_exists($this->ftp_connection_string . $this->remote_root . $target)){ unlink ($this->ftp_connection_string . $this->remote_root . $target); } copy ($this->local_root . $source, $this->ftp_connection_string . $this->remote_root . $target ); } function get
($source,$target) { if (file_exists($this->local_root . $target)){ unlink ($this->local_root . $target); } copy ($this->ftp_connection_string . $this->remote_root . $source, $this->local_root . $target ); } function delete
($target) { unlink($this->ftp_connection_string . $this->remote_root . $target); }}?> Das einzige was schöner ist, dass ich jetzt weniger Spagetti in der eigentlichen Schnittstelle habe.
Aus dem ganzen Mist von oben ist nur das übrig geblieben:
// get file and write to variable $Modified_Orders$ftps = new ftps
;$ftps->get($FTP_remotedir . $FTP_file, 'outfile/'. $FTP_file);$Modified_Orders = file_get_contents('../outfile/'. $FTP_file); Was für Unwägbarkeiten meinst Du? Wie lade ich Dateien hoch mit https? Hast du da mal ein Codebeispiel?