Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: FTPS PHP Klasse?

    Bonsai

    • Viel Schreiber
    • Beiträge: 4.127
    • Geschlecht:
    FTPS PHP Klasse?
    am: 19. Februar 2015, 16:49:08
    Ich hatte bei meinem alten Provider für eine Schnittstelle SFTP genutzt. Das lief wunderbar mit der phpseclib Klasse.

    Der neue Provider unterstützt kein SFTP, nur FTPS. Also TLS über FTP.

    Gibt es da irgendeine vernünftige Klasse? Ich finde mit Google immer nur Fetzen wie das da:
    http://www.maxrice.com/php-curl-connect-to-ftp-server-with-implicit-ssl-tls/
    Upload geht, aber kein Download und kein dir :-( Habe jetzt eigentlich keine Zeit die Klasse da zu komplettieren.

    Außerdem findet man noch tausende von Hilfegesuchen weil ftp_ssl_connect() auf Windoof nicht läuft.  :datz:

    Linkback: https://www.modified-shop.org/forum/index.php?topic=32305.0

    webald

    • modified Team
    • Beiträge: 2.791
    Re: FTPS PHP Klasse?
    Antwort #1 am: 19. Februar 2015, 17:48:48
    ???

    Was von wo nach wo? Was hat das mit Win zu tun?

    h-h-h

    • modified Team
    • Beiträge: 4.562
    Re: FTPS PHP Klasse?
    Antwort #2 am: 19. Februar 2015, 18:33:46
    http://stackoverflow.com/a/22267408/4348232
    Zitat
    As for 'ftp using ssl/tls' alias 'ftps': Your answer is here**. Don't waste time on ftp_ssl_connect() :-)

    ** http://stackoverflow.com/questions/21854012/is-it-possible-to-work-with-ftps-under-php-using-stream-context/21880613#21880613

    FTPES ist mir auch lieber als FTP, aber nicht immer so leicht zu händeln.

    Gruß, h-h-h

    Bonsai

    • Viel Schreiber
    • Beiträge: 4.127
    • Geschlecht:
    Re: FTPS PHP Klasse?
    Antwort #3 am: 20. Februar 2015, 09:15:19
    @h-h-h: Danke!

    @webald: Die Schnittstelle läuft hier auf einem Lokalen xampp, also auf Windoof.

    Note: Why this function may not exist

    ftp_ssl_connect() is only available if both the ftp module and the OpenSSL support is built statically into php, this means that on Windows this function will be undefined in the official PHP builds. To make this function available on Windows you must compile your own PHP binaries.

    Hättest Du Lust auf Windoof php selbst zu kompilieren? Da brauche ich ja Tage bis der Kompiler läuft und alle Abhängigkeiten aufgelöst sind und sämtliche auftretenden Probleme gelöst sind.

    webald

    • modified Team
    • Beiträge: 2.791
    Re: FTPS PHP Klasse?
    Antwort #4 am: 20. Februar 2015, 10:24:26
    Ich verstehe das was Du machen willst immer noch nicht ganz, aber u. a. wegen der Unwägbarkeiten bei ftp und Co übertragen wir Dateien per http(s).

    Bonsai

    • Viel Schreiber
    • Beiträge: 4.127
    • Geschlecht:
    Re: FTPS PHP Klasse?
    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:
    Code: PHP  [Auswählen]
    // connect
    if ($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);
    }
    // authenticate
    if ($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 dir
    if (!$SFTP_connection->chdir($FTP_remotedir)) {
            die ("FEHLER: FTP Remoteverzeichnis " . $FTP_remotedir . " nicht gefunden!");
    }

    // get file and write to variable $Modified_Orders
    if ($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.
    Code: PHP  [Auswählen]
    <?php
    class 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:
    Code: PHP  [Auswählen]
    // 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?

    webald

    • modified Team
    • Beiträge: 2.791
    Re: FTPS PHP Klasse?
    Antwort #6 am: 20. Februar 2015, 14:28:29
    Codebeispiel steht im Shop selber schon drin. Schau Dir mal an wie die Bilder hochgeladen und verarbeitet werden. Das kann man auch für jede x-beiebige Datei in ähnlicher Weise nutzen.

    Aber... ich bastel gerade an einer allgemeineren Lösung, da mußt Du ggf. gar keine Dateien mehr übertragen, sondern nur noch die Daten: Vollzugriff auf den Shop über REST/JSON und das ganze auch noch verschlüsselt. Dazu ein Rechtesystem, das dem Nutzer nur erlaubt bestimmte Funktionen des Webservice zu nutzen. Meine Tests mit einem eigenes geschriebenen Windows-Programm waren ganz gut bis jetzt.

    Für Dich bedeutet dies wohl, dass Dein lokaler Rechner (Lexware?) z. B. über einen Dienst in Windows Daten von und zum Shop übertragen ohne Datei zu senden, ohne Schreibrechte für FTP, ohne Dateien löschen zu müssen. Wie aber an meinen anderen Threads zu sehen ist stoße ich immer wieder auf den ein oder anderen Fehler/Unzulänglichkeit und bin noch nicht durch alle Tabellen durch. Wennich fertig bin gibt es auch ein Programmierbeispiel wie das in eigene Lösungen eingebuat werden kann.
    12 Antworten
    5624 Aufrufe
    28. April 2010, 21:13:48 von Tomcraft
    24 Antworten
    13840 Aufrufe
    05. Januar 2012, 19:52:14 von noRiddle (revilonetz)
    1 Antworten
    1914 Aufrufe
    08. Juni 2010, 20:12:47 von guensi
    7 Antworten
    3553 Aufrufe
    22. April 2010, 20:22:49 von marcel-k